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 nicht natürlich der Rest X (alles Übrige) sein?
Dasaru
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 nicht natürlich der Rest X (alles Übrige) sein?
Nawaz
Der C++ Standard (2003) sagt in §5.6/4,
[…] Wenn der zweite Operand von / oder % Null ist, ist das Verhalten nicht definiert; […]
Das heißt, die folgenden Ausdrücke rufen undefined-behavior(UB) auf:
X / 0; //UB
X % 0; //UB
Beachten Sie auch das -5 % 2
ist ungleich zu -(5 % 2)
(wie Petar in seinem Kommentar zu seiner Antwort vorzuschlagen scheint). Es ist implementierungsdefiniert. Die Spezifikation sagt (§5.6/4),
[…] Wenn beide Operanden nichtnegativ sind, dann ist der Rest nichtnegativ; wenn nicht, ist das Vorzeichen des Rests implementierungsdefiniert.
Ich würde wahrscheinlich eher zu “teilweise implementierung definiert”, das Zeichen ist implementierungsdefiniert, aber würde der Wert nicht festgelegt, sobald das Zeichen ausgewählt ist? Aber das ist nur Kleinigkeiten.
– mu ist zu kurz
10. September 2011 um 7:51 Uhr
Ist es möglich, das Programm mit Mod Zero zum Absturz zu bringen, oder ist nur das Ergebnis unbekannt?
– Zaffi
2. Oktober 2012 um 11:29 Uhr
@Zaffy: Da Mod Zero undefiniertes Verhalten (UB) aufruft, also ja, ist es möglich um Ihr Programm mit Mod Zero zum Absturz zu bringen, aber es ist so nicht garantiert Ihr Programm zum Absturz bringen. Programmabsturz ist nur eine von Millionen Möglichkeiten von UB.
– Nawaz
2. Oktober 2012 um 11:46 Uhr
Dies wurde als Duplikat verlinkt, und ich denke, dieser Beitrag sollte auf den neuesten Stand gebracht werden: Es ist nicht mehr implementierungsdefiniert, aber a/b + a%b
ist a
für alle a
und b
wobei der Quotient definiert ist (andernfalls ist das Verhalten undefiniert). Die Änderung erfolgte in C99 und C++11 (vielleicht schon in C++03 mit TR1, weiß nicht). Wäre schön, wenn Sie die Frage auch als C markieren könnten, da sie in dieser Hinsicht gleich sind (es war eine C-Frage, die dies duplizierte).
– Mafso
16. August 2014 um 17:33 Uhr
Und falls Sie sich fragen, warum sich C99 und C11 unterscheiden (bei C++ bin ich mir nicht sicher), ich erinnere mich, dass dies ein Defekt in C99 ist: INT_MIN % -1
wurde definiert, obwohl es auf vielen Plattformen eine Ausnahme auslöst. In C11, x%y
ist nur dann definiert, wenn x/y
ist, und es war nie sicher anzunehmen INT_MIN % -1
zu bewerten.
– Mafso
16. August 2014 um 17:39 Uhr
Mateen Ulhaq
Diese Antwort ist nichts für den Mathematiker. Diese Antwort versucht zu motivieren (auf Kosten der mathematischen Genauigkeit).
Mathematiker: Siehe hier.
Programmierer: Denken Sie an die Division durch 0
ist undefined
. Deswegen, mod
die auf der Division beruht, ist ebenfalls undefined
.
Dies stellt die Division für positiv dar X
und D
; Es besteht aus dem ganzzahligen Teil und dem Bruchteil:
(X / D) = integer + fraction
= floor(X / D) + (X % D) / D
Umstellen erhält man:
(X % D) = D * (X / D) - D * floor(X / D)
Ersetzen 0
zum D
:
(X % 0) = 0 * (X / 0) - 0 * floor(X / 0)
Seit Division durch 0
ist undefined
:
(X % 0) = 0 * undefined - 0 * floor(undefined)
= undefined - undefined
= undefined
Warum kannst du das äußere D in der zweiten Gleichung nicht einfach durch 0 ersetzen, um es zu machen (X % 0) = 0 * (w/e)
und es einfach null nennen?
– Yatharth Agarwal
29. November 2013 um 5:52 Uhr
@YatharthAgarwal Weil 0 * (w/e)
ist nicht immer 0. Wenn w/e
eine reelle Zahl ist (die ganze Zahlen enthält), dann ist sie 0. Wenn nicht, gibt uns die reguläre Multiplikation keine Antwort, dh die Antwort ist undefiniert.
– Dominik Pastore
5. September 2020 um 16:52 Uhr
Petar Iwanow
X % D
ist am Definition eine Zahl 0 <= R < D
so dass es existiert Q
damit
X = D*Q + R
Also wenn D = 0
kann keine solche Nummer existieren (weil 0 <= R < 0
)
Das stimmt nicht, AFAIK das Zeichen von x % y
ist die Implementierung definiert, wenn x < 0
. -5 % 2
ist auf meinem System zufällig -1.
– mu ist zu kurz
10. September 2011 um 7:08 Uhr
X = D*Q + R
funktioniert für irgendein Q
wann D = 0
mit X = R
wie der OP wollte. Es ist das 0 <= R < 0
das ist unmöglich zu befriedigen. Ihre Antwort scheint zu implizieren, dass es umgekehrt ist, obwohl ich es vielleicht nur falsch lese.
– Hammar
10. September 2011 um 7:11 Uhr
@ Petar: Nein. -5 % 2
ist nicht -(5 % 2)
eigentlich. Es ist implementierungsdefiniert. Die Spezifikation sagt, Wenn beide Operanden nichtnegativ sind, dann ist der Rest nichtnegativ; wenn nicht, ist das Vorzeichen des Rests implementierungsdefiniert
– Nawaz
10. September 2011 um 7:38 Uhr
Das Obige gilt für den Mathematikmodul. Aber CPUs und C-Compiler-Implementierungen geben oft R zurück, die das gleiche Vorzeichen wie X haben, also ist -5 % 2 = -(5 % 2) wahr. OTOH Python gibt den “wahren” Mathematikmodul zurück, sodass das obige nicht mehr wahr wäre. stackoverflow.com/questions/1907565/…
– phuklv
29. Oktober 2013 um 1:11 Uhr
Ich denke da bekommt man den Rest X % 0
musst du erstmal rechnen X / 0
was unendlich ergibt, und der Versuch, den Rest der Unendlichkeit zu berechnen, ist nicht wirklich möglich.
Die beste Lösung in Übereinstimmung mit Ihrem Denken wäre jedoch, so etwas zu tun
REMAIN = Y ? X % Y : X
Ein anderer Weg, der konzeptionell einfach sein könnte, um das Problem zu verstehen:
Für den Moment die Frage des Argumentzeichens ignorierend, a % b
könnte leicht umgeschrieben werden als a - ((a / b) * b)
. Der Ausdruck a / b
ist undefiniert, wenn b
Null ist, also muss in diesem Fall auch der Gesamtausdruck sein.
Am Ende ist der Modulus effektiv eine Teilungsoperation, also wenn a / b
undefiniert ist, ist es nicht unvernünftig zu erwarten a % b
genauso sein.
Anonym
X % Y
gibt ein Ergebnis in der Ganzzahl aus [ 0, Y )
range. X % 0
would have to give a result greater or equal to zero, and less than zero.
king_nak
you can evade the “divivion by 0” case of (A%B) for its type float identity mod(a,b) for float(B)=b=0.0 , that is undefined, or defined differently between any 2 implementations, to avoid logic errors (hard crashes) in favor of arithmetic errors…
by computing mod([a*b],[b])==b*(a-Etage(a))
ANSTELLE VON
rechnen mod([a],[b])
wo [a*b]==Ihre x-Achse im Laufe der Zeit
[b] == das Maximum der Wippenkurve (das nie erreicht wird) == die erste Ableitung der Wippenfunktion
@Mu die Antworten sind ganz anders. Hier erklärt Petar wie
%
mathematisch definiert ist, dort erklären sie, warum der Fehler das ist, anstatt etwas klarer.– xanatos
10. September 2011 um 9:36 Uhr
(aus einer jetzt gelöschten Nur-Link-Antwort von Dean Inada) Knuth et al. in Mathematik konstruieren Geben Sie die gleiche Definition wie Sie. (PdfSeite 82, Definition 3.22.)
– Cq
25. August 2014 um 1:09 Uhr
Du kannst keinen Rest von etwas haben, das du nicht geteilt hast.
– John John
23. Januar 2017 um 13:01 Uhr
Sehr schlechte Konzeptualisierung und Argumentation hier. Da der Quotient aus der Division durch 0 undefiniert ist, muss dies auch der Rest sein. Und es ist sehr merkwürdig, etwas „immer gedacht“ zu haben, das man Ihnen sicherlich nie beigebracht oder erzählt hat.
– Jim Balter
14. Oktober 2017 um 4:14 Uhr
“Die Antworten sind ganz anders” – das hat nichts damit zu tun, ob es sich bei den Fragen um Duplikate handelt. Meine Güte.
– Jim Balter
14. Oktober 2017 um 4:15 Uhr