webentwicklung-frage-antwort-db.com.de

Kann nicht Null ändern?

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)?

54
Dasaru

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 .

38
Nawaz

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 0undefined 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 0undefined ist:

(X % 0) = 0 * undefined - 0 * floor(undefined)
        = undefined - undefined
        = undefined
10
Mateen Ulhaq

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)

4
Petar Ivanov

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
2
Billy Moon

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.

2
Mac

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.

1
K-ballo

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

https://www.shadertoy.com/view/MslfW8

0
ollj