Ich bin kein Experte für Fließkommazahlen, aber Wikipedia sagt, dass doppelte 52 Bits Genauigkeit haben. Logischerweise scheint es, dass 52 Bits ausreichen sollten, um eine ganzzahlige Division von 32-Bit-Ganzzahlen zuverlässig zu approximieren.
Die Division der minimalen und maximalen 32-Bit-Vorzeichen, -2147483648/2147483647
, ergibt -1.0000000004656613
, was immer noch eine sinnvolle Anzahl signifikanter Stellen ist. Das gleiche gilt für seine Umkehrung 2147483647/-2147483648
, die -0.9999999995343387
produziert.
Eine Ausnahme ist division by zero, die ich in einem Kommentar erwähnt habe. Wie die verknüpfte SO-Frage angibt, löst eine Ganzzahl-Division durch Null normalerweise eine Art von Fehler aus, während eine Gleitkomma-Zwangsbedingung zu (1/0) | 0 == 0
führt.
Update: Nach another SO answer, Integer-Division in C kürzt gegen Null, das ist, was |0
in JavaScript tut. Darüber hinaus ist die Division durch 0 undefiniert, so dass JavaScript technisch nicht falsch ist, wenn es Null zurückgibt. Wenn ich nichts anderes verpasst habe, sollte die Antwort auf die ursprüngliche Frage ja sein.
Update 2: Relevante Abschnitte der ECMAScript 6 spec: Wie divide numbers und wie convert to a 32-bit signed integer zu, die what |0
does ist.
Haben Sie versucht, nach Gegenbeispielen zu suchen, die beweisen könnten, dass * nicht * immer korrekt ist? – Purag
Ich habe nicht. Da JavaScript alle Gleitkommazahlen formal behandelt, würde ich sehen, dass die Frage, auf die es ankommt, das Ergebnis der doppelten Präzisionsteilung zweier mathematischer Ganzzahlen im Bereich einer 32-Bit-Ganzzahl mit Vorzeichen ist, gefolgt von einer Kürzung auf 32 Bit Ganzzahl mit Vorzeichen und eine Simulation des Überlaufs gemäß der in EMCAScript 6 angegebenen abstrakten Operation "ToInt32()", die einer ganzzahligen Division der gleichen mathematischen Werte entspricht? Ich habe nicht den Eindruck, dass ich den Prozess der Gleitkommadivision gut genug verstehe, um dies selbst zu beantworten oder Gegenbeispiele abzuleiten, weshalb ich hier gefragt habe. – Textfield
Für Division durch Null, nein - es gibt 0 zurück, anstatt eine Ausnahme zu werfen: https://stackoverflow.com/questions/29179876/how-does-asm-js-handle-divide-by-zero – gengkev