2010-12-29 21 views
14

en JavaScript Me gustaría crear el dígito binario de una gran matriz booleana (54 elementos) con el siguiente método:Javascript sumando enteros grandes

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

En resumen: se crea el entero más pequeño para almacenar una matriz de booleanos en. Ahora mi problema es que javascript aparentemente usa flotadores por defecto. El número máximo Tengo que crear es de 2^54-1, pero una vez Javascript llega a los 2^53 que comienza a hacer cosas raras:

9007199254740992+1 = 9007199254740994 

¿Hay alguna manera de utilizar números enteros en lugar de los flotadores en javascript? O grandes sumas de enteros?

+3

Javascript no solo usa un tipo de coma flotante como valor predeterminado, no tiene * ningún otro tipo numérico, definitivamente no es una "buena parte" del idioma. –

Respuesta

18

Javascript utiliza el punto flotante internamente.

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

En otras palabras, no se puede utilizar más de 53 bits. En algunas implementaciones, puede limitarse a 31.

Intente almacenar los bits en más de una variable, utilice una cadena, o obtenga bignum library, o si solo necesita tratar con enteros, a biginteger library.

+1

Funcionó cuando agregué esa biblioteca y edité la función de la siguiente manera: 'function bhash (arr) { \t \t for (var i = 0, L = arr.length, sum = new BigNumber (" 0 "); i < L; suma = new BigNumber (Math.pow (2, i) * arr [i ++]). Add (suma)); \t \t return sum; \t} ' – Raven

1

Existen varias bibliotecas de BigInteger Javascript que puedes buscar a través de Google. p.ej. http://www.leemon.com/crypto/BigInt.html

+0

Hice lo siguiente: '' pero el código postal me dio un error> longitud de matriz no válida: "buff = new Array (k);" – Raven

1

No. Javascript solo tiene un tipo numérico. Tienes que codificar tú mismo o usar una biblioteca de enteros grande (y ni siquiera puedes sobrecargar los operadores aritméticos).

0

es probable que se encuentre con un límite de longitud de bytes en su sistema. tomaría la matriz de booleanos, la convertiría en una matriz de dígitos binarios ([verdadero, falso, verdadero] => [1,0,1]), luego uniría esta matriz a una cadena "101", luego usaría parseInt ('101', 2), y tendrás tu respuesta.