2016-04-01 14 views
2

Etwas seltsam mit Uint32 Mathematik:Javascript uint32 Mathe funktioniert nicht?

a = new Uint32Array([1103515245, 1103527590, 0]); 
a[2] = a[0] * a[1]; 
console.log(a[2]); 

2524872960 Gibt, die ich denke, weil in C falsch ist:

#include <stdio.h> 

int main() { 
    unsigned a[3] = { 1103515245, 1103527590, 0 }; 
    a[2] = a[0] * a[1]; 
    printf("%u\n", a[2]); 
    return 0; 
} 

Gibt 2524872878 (und tut dies Windows-Rechner)

Also, was ist damit fertig? Ich benutze Firefox 45.0.1

EDIT: Oh, und wenn das erwartet wird, wie kann ich dann das "C" Ergebnis duplizieren?

Antwort

4

Das liegt daran, dass JS keinen Ganzzahl-Typ hat. So * macht die Multiplikation in 64-Bit-Floats. Aber diese haben nicht genug Präzision für das Ergebnis:

/* Exact math */ 1103515245 × 1103527590 = 1217759518843109550 
/* JavaScript */ 1103515245 * 1103527590 === 1217759518843109600 
       Number.MAX_SAFE_INTEGER === 0009007199254740991 

Wenn Sie Integer-Multiplikation tun mögen, verwenden Sie Math.imul:

Die Math.imul() Funktion gibt das Ergebnis des C-wie 32-bit Multiplikation der beiden Parameter.

a[2] = Math.imul(a[0], a[1]); // -1770094418 
a[2];       // 2524872878 
+0

Ah, viel besser danke. – user9645