Was ist der konkrete Unterschied von rem und modulo in der funktionalen Programmierung?
Hi,
was ist der Unterschied zwischen mod und rem in Haskell?
Bei der Eingabe ins GHCI erhält man das gleiche Resultat.
(-4 `mod` 5) == (-4 `rem` 5)
TRUE
Allerdings ist hier FALSE:
(4 `mod` (-5)) == (4 `rem` (-5))
Habe im Internet recherchiert und das hier gefunden.
https://stackoverflow.com/questions/5891140/difference-between-mod-and-rem-in-haskell
"Yes, those functions act differently. As defined in the official documentation:
quot
is integer division truncated toward zero
rem
is integer remainder, satisfying:
(x `quot` y)*y + (x `rem` y) == x
div
is integer division truncated toward negative infinity
mod
is integer modulus, satisfying:
(x `div` y)*y + (x `mod` y) == x
Kann mir einer erklären, was diese Zeilen bedeuten? (integer modulus, integer remainder?
1 Antwort
Die Frage ist einfach, wie du bei der Ganzzahldivision rundest.
Hintergrund: Wenn du zwei natürliche Zahlen a und b hast, kannst du die "Division mit Rest" aus der Grundschule durchführen, also a / b = q, Rest r. Oder anders ausgedrückt:
a = b * q + r mit r < b.
Jetzt haben wir das Problem, dass a und b nicht unbedingt natürliche Zahlen sein müssen, sondern beliebige ganze Zahlen sein können. Und mit ganzzahligen Nennern und Resten ist diese Division mit Rest nicht mehr eindeutig. Zum Beispiel:
4 = 0 * (-5) + 4
oder auch:
4 = (-1) * (-5) + (-1).
In beiden Fällen ist |r| < |b|, weswegen beides valide Antworten wären.
Die Frage ist also, was wir als Quotienten betrachten wollen:
Ist 4/(-5) = 0 oder 4/(-5) = (-1)?
Die erste Antwort wäre das Runden zur 0 hin, die zweite Antwort wäre "immer abrunden". Und genau das ist auch der Unterschied:
4 `quot` (-5) = 0, während
4 `div` (-5) = -1.
Dementsprechend ist
4 `rem` (-5) = 4 und
4 `mod` (-5) = -1.
... Wenn du das alles bis hierhin verstanden hast, fragst du dich sicher, weshalb deine erste Eingabe "TRUE" zurückliefert. Das tut sie, weil das Minus-Symbol schwächer bindet als `rem` und `mod`. Du hättest stattdessen
((-4) `mod` 5) == ((-4) `rem` 5)
eingeben sollen.
Ja, die senkrechten Striche sind Betragszeichen.
Zugegebenermaßen hab ich die Faktoren heimlich vertauscht. Wenn wir bei der Form
a = bq + r
bleiben wollen, hätte ich eher
4 = (-5) * 0 + 4 schreiben sollen. Dann wäre nämlich
|4| < |-5| korrekt. Analog wäre
4 = (-5) * (-1) + (-1) mit
|-1| < |-5|.
Vielen Dank.
Also, bei mir haperts schon am Anfang.
4 = 0 * (-5) + 4
4 = 4 (wahr) 4 < 0 ist falsch
4 = (-1) * (-5) + (-1).
4 = 4 (wahr) -1 < -1 ist falsch
Die zwei Senkricht-Striche bedeuten Betrag, oder?
Wäre nett, wenn du mir den Teil hier nochmal kurz erklären würdest, bevor ich dann den restlichen Teil versuche, zu begreifen.