Es scheint eine gemeinsame Verwirrung zu sein zwischen den Begriffen "Modulo" und "Rest".
In der Mathematik sollte ein Rest immer mit dem Quotienten konsistent definiert werden, so dass, wenn a/b == c rem d
dann (c * b) + d == a
. Abhängig davon, wie Sie Ihren Quotienten runden, erhalten Sie unterschiedliche Reste.
modulo sollte jedoch immer ein Ergebnis 0 <= r < divisor
ergeben, das nur dann konsistent ist, wenn die negativen Zahlen ganzzahlig sind. Wenn die Division in Richtung Null läuft (was üblich ist), sind Modulo und Rest nur äquivalent für nicht-negative Werte.
Einige Sprachen (insbesondere C und C++) definieren nicht die erforderlichen Rundungs-/Restverhalten und %
ist mehrdeutig. Viele definieren die Rundung als gegen Null, aber verwenden Sie den Ausdruck modulo, wo der Rest richtiger wäre. Python ist insofern relativ ungewöhnlich, als es auf die negative Unendlichkeit rundet, so dass Modulo und Rest äquivalent sind.
Ada Runden gegen Null IIRC, hat aber beide mod
und rem
Betreiber.
Die C-Richtlinie soll es Compilern ermöglichen, die effizienteste Implementierung für die Maschine zu wählen, aber IMO ist zumindest in diesen Tagen eine falsche Optimierung. Ein guter Compiler wird wahrscheinlich in der Lage sein, die Äquivalenz für die Optimierung zu verwenden, wo immer eine negative Zahl nicht auftreten kann (und fast sicher, wenn Sie unsignierte Typen verwenden). Auf der anderen Seite, wo negative Zahlen auftreten können, kümmern Sie sich fast sicher um die Details - aus Gründen der Portabilität müssen Sie sehr sorgfältig entworfene überkomplexe Algorithmen und/oder Prüfungen verwenden, um sicherzustellen, dass Sie unabhängig von Rundung und Rest die gewünschten Ergebnisse erhalten Verhalten. Mit anderen Worten, der Gewinn für diese "Optimierung" ist meistens (wenn auch nicht immer) eine Illusion, während es in einigen Fällen sehr reale Kosten gibt - also ist es eine falsche Optimierung.
Sie können 'math.fmod' verwenden, um das gleiche Verhalten wie in C oder Java zu erhalten. – Helio