Apa sebenarnya perbedaan antara mod
dan rem
di Haskell?
Keduanya sepertinya memberikan hasil yang sama
*Main> mod 2 3
2
*Main> rem 2 3
2
*Main> mod 10 5
0
*Main> rem 10 5
0
*Main> mod 1 0
*** Exception: divide by zero
*Main> rem 1 0
*** Exception: divide by zero
*Main> mod 1 (-1)
0
*Main> rem 1 (-1)
0
mod
ulus ==rem
ainder.div
danquot
Jawaban:
Mereka tidak sama ketika argumen kedua negatif:
sumber
rem
danmod
di Clojure, dan ini adalah jawabannya.rem
tercepat.Ya, fungsi-fungsi itu bertindak secara berbeda. Sebagaimana didefinisikan dalam dokumentasi resmi :
quot
adalah pembagian bilangan terpotong ke arah nolrem
sisa integer, memuaskan:div
adalah pembagian integer yang terpotong menuju infinity negatifmod
adalah integer modulus, memuaskan:Anda benar-benar dapat melihat perbedaan ketika Anda menggunakan angka negatif sebagai parameter kedua dan hasilnya bukan nol:
sumber
mod
danrem
kaitkan lebih kuat daripada(-)
. Saya telah mengedit komentar Anda karena sepertinya saya tidak bisa memasukkan banyak hal dalam komentar ini.(-5) `mod` 3 == 1
Secara praktis berbicara:
Jika Anda tahu kedua operan positif, Anda harus biasanya menggunakan
quot
,rem
atauquotRem
untuk efisiensi.Jika Anda tidak tahu kedua operan itu positif, Anda harus memikirkan seperti apa hasil yang Anda inginkan. Anda mungkin tidak mau
quotRem
, tetapi Anda mungkin juga tidak maudivMod
. The(x `div` y)*y + (x `mod` y) == x
hukum adalah salah satu yang sangat baik, tetapi pembulatan divisi menuju tak terhingga negatif (divisi gaya Knuth) sering kurang berguna dan kurang efisien daripada memastikan bahwa0 <= x `mod` y < y
(divisi Euclidean).sumber
Jika Anda hanya ingin menguji apakah dapat dibagi, Anda harus selalu menggunakannya
rem
.Pada dasarnya
x `mod` y == 0
setara denganx `rem` y == 0
, tetapirem
lebih cepat darimod
.sumber