Ich persönlich bevorzuge die floored Division (im folgenden "div"
genannt) gegenüber der symmetric Division (im folgenden "quot" genannt).
Eng verbunden mit der Integer-Division ist die Modulo-Funktion. Die zu
div gehörende Funktion sei "mod" und die zu quot gehörende "rem"
genannt.
Im angehängten Diagramm sind div und mod grün, und quot und rem rot
dargestellt.
Gründe für meiner Präferenz von div und mod:
- Bei gegebenem Divisor haben quot und rem um 0 herum einen
unregelmäßigen Verlauf, was vor allem bei der Programmierung stört.
- Das erschwert u.a. auch die zum nächsten Nachbarn gerundete Division.
Die gerundete Division durch durch 6 kann man bspw. so schreiben:
x / 6 = div(x + 3, 6)
Das funktioniert für positive und negative x. Ersetzt man div durch
quot, stimmt das Ergebnis für negative x nicht mehr, d.h. man braucht
hier eine Fallunterscheidung.
- Aus mathematischer Sicht ermittelt x modulo y eine Restklasse und
liefert als Ergebnis einen Repräsentanten dieser Klasse. Welcher der
unendlich vielen möglichen Repräsentanten der geeignetste ist, ist
diskutabel. Was aber IMHO sehr schlecht ist, wenn bei gleicher
Restklasse nicht immer der gleiche Repräsentant ausgewählt wird.
Beispiel:
Die zu 7 modulo 3 und -5 modulo 3 gehörenden Restklassen sind beide
gleich, nämlich {..., -8, -5, -2, 1, 4, 7, 10, ...}. Dennoch sind
rem(7,3) = 1 und rem(-5,3) = -2 verschieden. Auf der anderen Seite ist
mod(7,3) = mod(-5,3) = 1, wie es sein sollte.
Andersherum habe ich noch keinen Fall erlebt, wo quot und rem einen
programmiertechnischen Vorteil gegenüber div und mod gehabt hätten.
Deswegen schränke ich für mich die Verwendung dieser Operatoren wie
folgt ein:
1. Stehen nur quot und rem zur Verfügung (wie bspw. in C und C++),
verwende ich nur nichtnegative Operanden.
2. Stehen nur div und mod zur Verfügung (wie bspw. in Python), verwende
auch negative Dividenden. Beim Divisor beschränke ich mich dennoch
auf nichtnegative, weil ich negative noch nie gebraucht habe, und
diese zudem etwas verwirrend finde.
3. Stehen sowohl quot und rem als auch div und mod zur Verfügung (wie
bspw. in Haskell), beschränke ich mich auf div und mod und verwende
diese wie in (2).