Kann Zero nicht modden?

Lesezeit: 6 Minuten

Kann Zero nicht modden
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?

  • @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

Kann Zero nicht modden
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


Kann Zero nicht modden
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, moddie 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

1646315413 475 Kann Zero nicht modden
Petar Iwanow

X % D ist am Definition eine Zahl 0 <= R < Dso dass es existiert Q damit

X = D*Q + R

Also wenn D = 0kann 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 = 0mit 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.

1646315414 319 Kann Zero nicht modden
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.

1646315415 855 Kann Zero nicht modden
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

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

924030cookie-checkKann Zero nicht modden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy