Warum ist X % 0
ein ungültiger Ausdruck?
Ich dachte immer, X % 0
sollte gleich X sein. Da Sie nicht durch Null teilen können, sollte die Antwort natürlich nicht der Rest sein, X (alles übrig geblieben)?
Der C++ - Standard (2003) sagt in §5.6/4,
[...] Wenn der zweite Operand von/oder% Null ist, ist das Verhalten undefined ; [...]
Folgende Ausdrücke rufen also undefined-behaviour (UB) auf:
X / 0; //UB
X % 0; //UB
Beachten Sie auch, dass -5 % 2
NICHT gleich -(5 % 2)
ist (wie Petar in seinem Kommentar zu seiner Antwort zu vermuten scheint). Es ist implementierungsdefiniert. Die Spezifikation sagt (§5.6/4),
[...] Wenn beide Operanden nicht negativ sind, ist der Rest nicht negativ. falls nicht, ist das Vorzeichen des Restes durch die Implementierung definiert .
Diese Antwort ist nicht für den Mathematiker. Diese Antwort versucht Motivation zu geben (auf Kosten mathematischer Genauigkeit).
Mathematiker:Siehe hier.
Programmierer: Denken Sie daran, dass Division durch 0
undefined
ist. Daher ist mod
, das auf Division basiert, auch undefined
.
Dies stellt eine Division für positive X
und D
dar; es besteht aus dem integralen Teil und dem gebrochenen Teil:
(X / D) = integer + fraction
= floor(X / D) + (X % D) / D
Umstellen erhalten Sie:
(X % D) = D * (X / D) - D * floor(X / D)
D
durch 0
ersetzen:
(X % 0) = 0 * (X / 0) - 0 * floor(X / 0)
Da Division durch 0
undefined
ist:
(X % 0) = 0 * undefined - 0 * floor(undefined)
= undefined - undefined
= undefined
X % D
ist durch Definition eine Nummer 0 <= R < D
, so dass Q
existiert, so dass
X = D*Q + R
Wenn D = 0
, kann keine solche Nummer existieren (weil 0 <= R < 0
)
Ich denke, um den Rest von X % 0
zu erhalten, müssen Sie zuerst X / 0
berechnen, der Unendlichkeit ergibt, und der Rest der Unendlichkeit zu berechnen ist nicht wirklich möglich.
Die beste Lösung im Einklang mit Ihrem Denken wäre jedoch, so etwas zu tun
REMAIN = Y ? X % Y : X
Eine andere Möglichkeit, die möglicherweise konzeptionell leicht zu verstehen ist:
Die Ausgabe des Argumentzeichens ignorieren, a % b
könnte leicht als a - ((a / b) * b)
umgeschrieben werden. Der Ausdruck a / b
ist nicht definiert, wenn b
Null ist. In diesem Fall muss auch der Gesamtausdruck derselbe sein.
Am Ende ist der Modul tatsächlich eine spaltende Operation. Wenn also a / b
nicht definiert ist, ist es nicht unangemessen zu erwarten, dass a % b
auch so ist.
X% Y ergibt ein Ergebnis im ganzzahligen Bereich (0, Y). X% 0 müsste ein Ergebnis größer oder gleich Null und kleiner als Null ergeben.
sie können den Fall "Division durch 0" von (A% B) für den Typ float identity mod (a, b) für float (B) = b = 0.0 umgehen, der undefiniert ist oder zwischen 2 beliebigen Implementierungen unterschiedlich definiert ist Vermeiden Sie logische Fehler (harte Abstürze) zugunsten von Rechenfehlern ...
durch Berechnung von mod([a*b],[b])==b*(a-floor(a))
INSTREAD OF
computing mod([a],[b])
wobei [a * b] == Ihre x-Achse, über die Zeit [b] == das Maximum der Wippkurve (das niemals erreicht wird) == die erste Ableitung der Wippfunktion