Hier ist eine neue Antwort auf eine alte Frage, die auf diesem Microsoft Research-Dokument und den darin enthaltenen Referenzen basiert .
Man beachte , dass von C11 und C ++ 11 ab, die Semantik div
worden Trunkierung gegen Null (siehe [expr.mul]/4
). Darüber hinaus garantiert C ++ 11 für D
dividiert durch d
Folgendes den Quotienten qT
und den RestrT
auto const qT = D / d;
auto const rT = D % d;
assert(D == d * qT + rT);
assert(abs(rT) < abs(d));
assert(signum(rT) == signum(D));
Dabei signum
werden -1, 0, +1 zugeordnet, je nachdem, ob das Argument <, ==,> als 0 ist ( Quellcode finden Sie in diesen Fragen und Antworten).
Bei abgeschnittener Division ist das Vorzeichen des Restes gleich dem Vorzeichen der DividendeD
, d -1 % 8 == -1
. H. C ++ 11 bietet auch eine std::div
Funktion, die eine Struktur mit Elementen quot
und rem
entsprechend der abgeschnittenen Unterteilung zurückgibt .
Es gibt noch andere Definitionen möglich, zB sogenannte Boden Teilung kann in Bezug auf die builtin abgeschnitten Teilung definiert werden
auto const I = signum(rT) == -signum(d) ? 1 : 0;
auto const qF = qT - I;
auto const rF = rT + I * d;
assert(D == d * qF + rF);
assert(abs(rF) < abs(d));
assert(signum(rF) == signum(d));
Bei einer Bodenteilung entspricht das Vorzeichen des Restes dem Vorzeichen des Teilersd
. In Sprachen wie Haskell und Oberon gibt es eingebaute Operatoren für die Teilung von Fußböden. In C ++ müssen Sie eine Funktion mit den obigen Definitionen schreiben.
Ein weiterer Weg ist die euklidische Teilung , die auch als eingebaute abgeschnittene Teilung definiert werden kann
auto const I = rT >= 0 ? 0 : (d > 0 ? 1 : -1);
auto const qE = qT - I;
auto const rE = rT + I * d;
assert(D == d * qE + rE);
assert(abs(rE) < abs(d));
assert(signum(rE) != -1);
Bei der euklidischen Teilung ist das Vorzeichen des Restes immer positiv .