Mengapa mod (%) operator matematika dasar dalam banyak bahasa pemrograman?

17

Adakah alasan, historis atau tidak, mengapa operator modulus adalah bagian dari sekumpulan kecil operator standar dalam apa yang tampak seperti banyak bahasa? ( +, -, *, /dan %, untuk Java dan C, dengan **di Ruby dan Python).

Tampaknya aneh untuk memasukkan mod sebagai "fundamental" (bukan untuk mengetuknya, saya banyak menggunakannya, tetapi saya juga menggunakan eksponensial, nilai absolut, lantai / langit-langit atau lainnya - mereka tampaknya sama berguna dan perlu). Apakah ini keputusan lama yang dibuat dalam beberapa spesifikasi yang diikuti oleh Java, C, Ruby dan Python atau bahasa tempat mereka semua berasal? Sejauh yang saya tahu sebagian besar dialek Lisp hanya menyertakan +, -, /dan *.

Pada awalnya saya bertanya-tanya apakah mod sangat mudah diimplementasikan pada tingkat biner (apakah itu akan membuat perbedaan, mengenai keputusan tentang apa yang seharusnya menjadi operator "fundamental" dan apa yang tidak boleh?) Tetapi tampaknya tidak. Apakah ini jauh lebih umum digunakan dalam pemrograman daripada yang saya kira?

Eli Rose - REINSTATE MONICA
sumber

Jawaban:

20

Saya yakin itu biasa karena banyak arsitektur CPU menerapkan modulussebagai output kedua dari instruksi pembagian integer.

Saya tidak ingat hadir di CPU tahun 1970-an (6800, 8080, Z80, 1604, dll.), Tetapi pada 1980-an, Intel 8086 dan 8088, serta Motorola 6809 memilikinya.

Arsitektur instruksi PDP-11 ditentukan untuk DIVmenghasilkan hasil bagi dan sisa dari awal (1970), meskipun instruksi MUL dan DIV tidak hadir pada desain awal, tetapi dapat ditiru secara transparan oleh "instruksi tidak diterapkan perangkap" dan diimplementasikan dengan pawang yang melakukan sedikit twiddling. Mungkin fitur PDP-11 mendorong edisi pertama bahasa C yang menyediakan %fitur tersebut. (Pernah memperhatikan bagaimana tanda persen memiliki garis miring di dalamnya? Itu membuatnya menjadi pilihan cerdas untuk operator terkait divisi.)

Kehadiran modulus Csendirian mungkin dapat menjelaskan kehadirannya dalam semua bahasa modern. Cmemiliki keluarga keturunan yang sangat besar dan sebaliknya cukup berpengaruh.

wallyk
sumber
3
Pengaruh +1 C pada hampir semua bahasa non-LISP sejak awal 1970-an tidak dapat dilebih-lebihkan.
Ross Patterson
8

Banyak bahasa pemrograman memiliki operator "sisa" yang dapat digunakan sebagai operator modulus ketika kedua operan positif; kata operator itu sering disebut operator "modulus", karena itulah penggunaan utamanya. Bahasa umumnya memiliki operator seperti itu karena banyak perangkat keras divisi platform perangkat keras secara otomatis memasok sisanya ketika melakukan pembagian, dan menghitung sisa atau modulus melalui cara lain akan jauh lebih sulit.

Saya tidak tahu sejarah dukungan perangkat keras untuk divisi yang ditandatangani; banyak prosesor selama bertahun-tahun menyediakan perangkat keras yang dapat secara otomatis melakukan pembagian yang ditandatangani dengan aturan bahwa jika a / b menghasilkan (q, r), maka -a / b atau / -b akan menghasilkan (-q, -r), tetapi Saya tidak yakin dengan kasus penggunaan di mana pembagian menggunakan aturan itu sangat membantu. Dalam hampir setiap kasus di mana saya telah menggunakan operasi integer division atau "modulus" pada nilai-nilai negatif, saya ingin round-towards-negative-infinity pada divisi dan operasi modulus sejati (sehingga (a + b) / b akan selalu sama (a / b) +1 dan (a + b)% b akan selalu sama dengan% b.). Karena operator tidak bekerja seperti itu, perlu untuk menguji tanda dividen dan menggunakan kode yang berbeda ketika ' negatif - pada dasarnya meniadakan manfaat dari memiliki instruksi pembagian yang ditandatangani di tempat pertama. Saya ingin tahu untuk tujuan apa dukungan divisi yang ditandatangani pada perangkat keras sebenarnya berguna.

Kembali ke pertanyaan awal, operator modulus sering berguna dalam situasi di mana hal-hal tertentu seharusnya terjadi secara berkala, baik di ruang angkasa (misalnya koordinat grafis) atau dalam waktu. Misalnya, jika seseorang ingin agar suatu peristiwa terjadi setiap 15 detik, waktu hingga peristiwa berikutnya adalah 15 - ((time_now - time_of_an_occurrence)% 15), dengan asumsi time_of_an_occurrencetidak lebih besar daritime_now . Jika time_of_an_occurrencelebih besar daritime_now , operator modulus dapat terus menggunakan rumus yang sama asalkan pengurangan tidak meluap, tetapi operator sisanya akan memerlukan formula yang berbeda.

supercat
sumber
3
Untuk alasan itu, Haskell memiliki dua operator: remuntuk sisanya dan moduntuk modulus dengan properti yang Anda uraikan.
Ingo
@ Complicatedseebio: Apa yang sangat lucu adalah bahwa ia sering disebut operator modulus karena umumnya digunakan untuk menghitung modulus, bahkan ketika itu memerlukan kode seperti m = number % base; if (m < 0) m+=base;. Saya tidak tahu bahwa saya pernah melihat kode apa pun yang mendapat manfaat dari operator sisanya menjadi negatif, kecuali mungkin q = n/d; if (n%d < 0) q+=1;, yang dalam hal apa pun dapat ditulis lebih baik dengan cara lain.
supercat
3

Modulus terkait erat dengan teori grup dan cincin, yang merupakan teori matematika yang sangat mendasar.

Eksponensial hanyalah operasi ketiga dalam penambahan deret, perkalian, eksponensial, tetrasi (dan itu deret tak terhingga). Itu menjadi penting terutama dengan bilangan kompleks, yang lebih jarang di aritmatika komputer. Satu eksponensial tertentu didukung secara eksplisit, meskipun: 2 n umumnya ditulis sebagai1<<n , karena komputer cukup biner.

Lantai dan langit-langit sangat jarang dibandingkan: Mereka hanya berlaku ketika mengkonversi dari ℝ ke ℤ. (floating point to integer). Demikian pula, absdikaitkan dengan pemetaan dari ℤ ke ℕ

MSalters
sumber
ℤ adalah bilangan bulat (dan ℕ adalah himpunan bagian bilangan bulat), yang Anda maksud adalah ℝ hingga ℤ.
Joni
@Joni: Campuran dua contoh, diperbaiki.
MSalters
0

Maaf, tetapi dengan risiko mengubah ini menjadi permainan "Call My Bluff", saya pikir jawaban sebenarnya untuk pertanyaan ini cukup sederhana:

Mod memungkinkan perhitungan yang tepat dalam jumlah dan unit "non-desimal" seperti tanggal, waktu, pekarangan, inci, ons, dll. Dalam perhitungan desimal, ia juga menyediakan metode bagi pemrogram untuk bekerja pada ketepatan numerik di luar yang disediakan oleh perangkat keras dari mesin. Ini memiliki sejumlah besar aplikasi dari yang sangat kecil (misalnya perhitungan kuantum) hingga yang sangat besar (misalnya menemukan bilangan prima baru).

Penting untuk dipahami bahwa kami menyebut benda-benda ini komputer karena suatu alasan. Terkadang kita membutuhkan mereka untuk memberi kita jawaban yang benar!


sumber
Jawaban ini tidak masuk akal ... Apa hubungan antara menggunakan "mod" dan menggunakan unit yang berbeda ???