2010-12-29 2 views
14

w JavaScript Chciałbym tworzenia binarnych mieszania z dużą logicznej tablicy (54 elementów), za pomocą następującego sposobu:JavaScript zsumowanie duże całkowite

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

Krótko mówiąc, tworzy najmniejszą liczbę całkowitą zawierać tablicę of booleans in. Teraz mój problem polega na tym, że javascript domyślnie używa pływa jako jako domyślny. Maksymalna liczba muszę tworzyć wynosi 2^54-1 ale raz javascript osiągnie 2^53 to zaczyna robić dziwne rzeczy:

9007199254740992+1 = 9007199254740994 

jest jakiś sposób korzystania z liczb całkowitych zamiast pływaków w javascript? Lub duże sumy całkowite?

+3

Javascript wykorzystuje nie tylko typ zmiennoprzecinkowy jako domyślny, nie * ma * żadnego innego typu liczbowego - zdecydowanie nie jest "dobrą częścią" języka. –

Odpowiedz

18

JavaScript wykorzystuje wewnętrznie punkt zmiennoprzecinkowy.

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

Innymi słowy nie można używać więcej niż 53 bitów. W niektórych implementacjach użytkownik może być ograniczony do 31.

Spróbuj zapisać bity w więcej niż jednej zmiennej, użyj ciągu lub uzyskaj bignum library lub jeśli potrzebujesz tylko obsługi liczb całkowitych, biginteger library.

+1

Zadziałało, gdy dodałem tę bibliotekę i edytowałem funkcję w następujący sposób: 'function bhash (arr) { \t dla (var i = 0, L = arr.length, sum = new BigNumber (" 0 "); i < L; sum = new BigNumber (Math.pow (2, i) * arr [i ++]). Add (sum)); \t \t suma zwrotu; \t} – Raven

1

Istnieje wiele bibliotek Javascript BigInteger, które można znaleźć w Google. na przykład http://www.leemon.com/crypto/BigInt.html

+0

Wykonałem następujące czynności: '' ale cosole dał mi błąd> niepoprawna długość tablicy: "buff = new Array (k);" – Raven

1

Nie. JavaScript ma tylko jeden typ numeryczny. Musisz kodować siebie lub korzystać z dużej biblioteki całkowitej (i nie możesz nawet przeciążać operatorów arytmetycznych).

0

prawdopodobnie używasz limitu długości bajtów w systemie. Wezmę tablicę booleans, skonwertuję ją na tablicę cyfr binarnych ([true, false, true] => [1,0,1]), a następnie dołącz tę tablicę do ciągu znaków "101", a następnie użyj parseInt ('101', 2), a otrzymasz odpowiedź.