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?
sumber
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_occurrence
tidak lebih besar daritime_now
. Jikatime_of_an_occurrence
lebih besar daritime_now
, operator modulus dapat terus menggunakan rumus yang sama asalkan pengurangan tidak meluap, tetapi operator sisanya akan memerlukan formula yang berbeda.sumber
rem
untuk sisanya danmod
untuk modulus dengan properti yang Anda uraikan.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 mungkinq = n/d; if (n%d < 0) q+=1;
, yang dalam hal apa pun dapat ditulis lebih baik dengan cara lain.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 sebagai
1<<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,
abs
dikaitkan dengan pemetaan dari ℤ ke ℕsumber
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