2010-12-29 5 views
14

In Javascript Ich mag den binären Hash eines großen boolean-Array (54 Elemente) mit dem folgende Verfahren erzeugen:Javascript Summieren große ganze Zahlen

function bhash(arr) { 
    for (var i = 0, L = arr.length, sum = 0; i < L; sum += Math.pow(2,i)*arr[i++]); 
    return sum; 
} 

Kurz gesagt: Es wird kleinste ganze Zahl, um ein Array zu speichern, von Booleans in. Jetzt ist mein Problem, dass Javascript anscheinend Schwimmer als Standard verwendet. Die maximale Anzahl I erstellen müssen, ist 2^54-1, aber sobald Sie Javascript 2^53 erreicht es seltsame Dinge beginnt zu tun:

9007199254740992+1 = 9007199254740994 

Gibt es eine Möglichkeit von ganzen Zahlen anstelle von Schwimmern in Javascript verwenden? Oder große ganzzahlige Summierungen?

+3

Javascript verwendet nicht nur einen Gleitkommatyp als Standard, es hat * keinen * anderen numerischen Typ - dezidiert kein "guter Teil" der Sprache. –

Antwort

18

Javascript verwendet Gleitkomma intern.

What is JavaScript's highest integer value that a Number can go to without losing precision?

Mit anderen Worten: Sie können nicht mehr als 53 Bits verwenden. In einigen Implementierungen können Sie bis 31

Versuchen Speichern der Bits in mehr als eine Variable begrenzt werden, verwenden Sie einen String oder eine bignum library bekommen, oder wenn Sie nur mit ganzen Zahlen beschäftigen, ein biginteger library.

+1

Es funktionierte, als ich diese Bibliothek hinzugefügt und die Funktion wie folgt bearbeitet: 'function bhash (arr) { \t \t für (var i = 0, L = arr.length, sum = new BigNumber (" 0 "); i < L; Summe = neue BigNumber (Math.pow (2, i) * arr [i ++]). Add (Summe)); \t \t Rücksendungssumme; \t} ' – Raven

1

Es gibt verschiedene BigInteger-Javascript-Bibliotheken, die Sie durch googlen finden können. z.B. http://www.leemon.com/crypto/BigInt.html

+0

Ich habe folgendes getan: '' aber das COSOL gab mir einen Fehler> ungültige Array-Länge: "buff = new Array (k);" – Raven

1

Nein Javascript hat nur einen numerischen Typ. Sie müssen sich selbst codieren oder eine große Ganzzahlbibliothek verwenden (und Sie können nicht einmal arithmetische Operatoren überladen).

0

Sie wahrscheinlich auf ein Byte Länge Limit auf Ihrem System läuft. Ich würde das Array von Booleans nehmen, es in ein Array von Binärziffern umwandeln ([true, false, true] => [1,0,1]), dann verbinde dieses Array in eine Zeichenfolge "101" und benutze dann parseInt ('101', 2), und du wirst deine Antwort haben.