2015-07-11 18 views
10

den folgenden Code gegeben, wobei beide a und b sind Number s Werte im Bereich von 32-Bit-Integer mit Vorzeichen darstellt:Javascript: Ist dies wirklich Signed Integer-Division

var quotient = ((a|0)/(b|0))|0; 

und unter der Annahme, dass die Laufzeit in voller Übereinstimmung mit den ECMAScript 6 Spezifikationen, wird der Wert quotientimmer die richtige vorzeichenbehaftete ganzzahlige Division von a und b als ganze Zahlen sein? Mit anderen Worten, ist dies eine geeignete Methode, um in JavaScript eine Ganzzahl-Division mit echten Vorzeichen zu erreichen, die dem Maschinenbefehl entspricht?

+1

Haben Sie versucht, nach Gegenbeispielen zu suchen, die beweisen könnten, dass * nicht * immer korrekt ist? – Purag

+1

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

+1

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

Antwort

4

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.