Was genau ist der Unterschied zwischen mod
und rem
in Haskell?
Beide scheinen die gleichen Ergebnisse zu liefern
*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
undquot
Antworten:
Sie sind nicht gleich, wenn das zweite Argument negativ ist:
quelle
rem
undmod
in Clojure, und das war die Antwort.rem
es am schnellsten zu sein.Ja, diese Funktionen verhalten sich anders. Wie in der offiziellen Dokumentation definiert :
quot
ist eine ganzzahlige Division, die gegen Null abgeschnitten istrem
ist ganzzahliger Rest, befriedigend:div
ist eine ganzzahlige Division, die in Richtung negativer Unendlichkeit abgeschnitten istmod
ist ein ganzzahliger Modul, der erfüllt:Sie können den Unterschied wirklich bemerken, wenn Sie eine negative Zahl als zweiten Parameter verwenden und das Ergebnis nicht Null ist:
quelle
mod
undrem
assoziieren stärker als(-)
. Ich habe Ihren Kommentar bearbeitet, da ich diesen Kommentar nicht mehrzeilig einfügen kann.(-5) `mod` 3 == 1
Praktisch gesprochen:
Wenn Sie wissen beide Operanden positiv sind, sollten Sie in der Regel verwenden
quot
,rem
oderquotRem
für Effizienz.Wenn Sie nicht wissen, dass beide Operanden positiv sind, müssen Sie sich überlegen, wie die Ergebnisse aussehen sollen. Sie wollen wahrscheinlich nicht
quotRem
, aber Sie wollen vielleicht auch nichtdivMod
. Das(x `div` y)*y + (x `mod` y) == x
Gesetz ist sehr gut, aber eine Rundung auf negative Unendlichkeit (Knuth-Stil-Teilung) ist oft weniger nützlich und weniger effizient als dies sicherzustellen0 <= x `mod` y < y
(euklidische Teilung).quelle
Wenn Sie nur die Teilbarkeit testen möchten, sollten Sie immer verwenden
rem
.Im Wesentlichen
x `mod` y == 0
entspricht,x `rem` y == 0
ist aberrem
schneller alsmod
.quelle