Wat is precies het verschil tussen mod
en rem
IN HASKELL?
Beide lijkt dezelfde resultaten te geven
*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
Antwoord 1, Autoriteit 100%
Ze zijn niet hetzelfde wanneer het tweede argument negatief is:
2 `mod` (-3) == -1
2 `rem` (-3) == 2
Antwoord 2, Autoriteit 38%
Ja, die functies werken anders. Zoals gedefinieerd in de officiële documentatie :
quot
is getal divisie afgekapt in de richting van nul
rem
IS GEEN TEGEERD REST, Bevredigend:
(x `quot` y)*y + (x `rem` y) == x
div
is getal divisie afgekapt in de richting van negatieve infinity
mod
is een geheel getal modulus, bevredigend:
(x `div` y)*y + (x `mod` y) == x
U kunt het verschil echt opmerken wanneer u een negatief getal gebruikt als tweede parameter en het resultaat is niet nul:
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
& nbsp;
Antwoord 3, Autoriteit 10%
praktisch gesproken:
Als u weet dat beide operanden positief zijn, moet u meestal quot
, rem
of quotRem
voor efficiëntie gebruiken.
Als u niet weet dat beide operanden positief zijn, moet u nadenken over wat u wilt dat de resultaten eruit zien. U wilt waarschijnlijk niet quotRem
, maar u wilt misschien niet divMod
. De (x `div` y)*y + (x `mod` y) == x
wet is een zeer goede, maar afrondingsafdeling in de richting van negatieve oneindigheid (divisie nevel) is vaak minder handig en minder efficiënt dan ervoor te zorgen dat 0 <= x `mod` y < y
(Euclidese divisie).
Antwoord 4, Autoriteit 4%
Als u alleen wilt testen voor deelbaarheid, moet u altijd rem
gebruiken.
In wezen x `mod` y == 0
is gelijk aan x `rem` y == 0
, maar rem
is sneller dan mod
.