Haskell'de `mod` ve` rem` arasındaki fark


130

Haskell modve remHaskell arasındaki fark tam olarak nedir ?

İkisi de aynı sonuçları veriyor gibi görünüyor

*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

3
Haskell'i bilmiyorum ama muhtemelen bunlar aynı operasyon. modulus == remainder.
Matthew Scharley

Adil olmak gerekirse, aynı soru değildi. Diğer soru, bu sorunun cevabının anlaşıldığını varsayıyordu.
Dan Burton

@Dan Bu soruyu okuduğum başka bir soru yüzünden ( stackoverflow.com/questions/5892188/… ) aynı şeyi fark ettim: /
Oscar Mederos

2
divve arasındaki fark aynıquot
newacct

Yanıtlar:


181

İkinci argüman olumsuz olduğunda aynı değildirler:

2 `mod` (-3)  ==  -1
2 `rem` (-3)  ==  2

20
Clojure hakkında remve modClojure'da aynı soruyu sormuştum ve cevap buydu.
noahlz

11
İlk argüman olumsuz olduğunda da aynı değildirler. Bkz stackoverflow.com/a/8111203/1535283 ve stackoverflow.com/a/339823/1535283 bu zor işlemler hakkında biraz daha bilgi için.
Scott Olson

4
Ayrıca stackoverflow.com/a/6964760/205521rem adresinden en hızlı gibi görünüyor .
Thomas Ahle

16
Bu cevap doğru olsa da, "fark nedir" sorusuna "aynı değil" den daha fazlasını iddia eden bir cevap çok kötüdür. Bunların "nasıl" farklı olduğunu ve muhtemelen bazı kullanım durumlarını genişletebilirseniz memnuniyetle karşılarım.
poitroae

59

Evet, bu işlevler farklı davranır. Resmi belgelerde tanımlandığı gibi :

quot tamsayı bölümü sıfıra doğru kesilir

rem kalan tam sayıdır, tatmin edici:

(x `quot` y)*y + (x `rem` y) == x

div tamsayı bölümü negatif sonsuza doğru kesilir

mod tamsayı modülüdür, tatmin edici:

(x `div` y)*y + (x `mod` y) == x

İkinci parametre olarak negatif bir sayı kullandığınızda ve sonuç sıfır olmadığında farkı gerçekten fark edebilirsiniz:

5 `mod` 3 == 2
5 `rem` 3 == 2

5 `mod` (-3) == -1
5 `rem` (-3) == 2

(-5) `mod` 3 == 1
(-5) `rem` 3 == -2

(-5) `mod` (-3) == -2
(-5) `rem` (-3) == -2

 


Sizin son dört örnekler, demek beri muhtemelen ne değildir modve remdaha güçlü daha ilişkilendirmek (-). Bu yoruma çok satırlı şeyler ekleyemediğim için yorumunuzu düzenledim.
Erik Hesselink

1
@ErikHesselink: Düzenlemenizde bir hata yaptınız. (-5) `mod` 3 == 1
Cheng Sun

@ChengSun Teşekkürler, düzelttim. İncelemeden sonra yayında olmalıdır.
Erik Hesselink

16

Pratik olarak konuşmak:

Eğer her iki işlenen pozitif biliyorsanız, genellikle kullanması gereken quot, remveya quotRemverimlilik için.

Her iki işlenenin de pozitif olduğunu bilmiyorsanız, sonuçların neye benzemesini istediğinizi düşünmelisiniz. Muhtemelen istemiyorsun quotRemama sen de istemeyebilirsin divMod. (x `div` y)*y + (x `mod` y) == xYasa çok iyi biridir, fakat negatif sonsuza (Knuth tarzı bölme) doğru bölünmesini yuvarlama genellikle daha az kullanışlı ve sağlamak daha az etkilidir 0 <= x `mod` y < y(Öklit bölümü).


5

Yalnızca bölünebilirliği test etmek istiyorsanız, her zaman kullanmalısınız rem.

Esasen x `mod` y == 0eşdeğerdir x `rem` y == 0, ancak remdaha hızlıdır mod.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.