JavaScript sumndo grandes inteiros

Em javascript eu gostaria de criar o hash binário de um grande array booleano (54 elementos) com o seguinte método:

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

Resumindo: ele cria o menor número inteiro para armazenar uma matriz de booleanos. Agora, meu problema é que o javascript aparentemente usa floats como padrão. O número máximo que eu tenho que criar é 2 ^ 54-1 mas uma vez que o javascript atinge 2 ^ 53 ele começa a fazer coisas estranhas:

 9007199254740992+1 = 9007199254740994 

Existe alguma maneira de usar inteiros em vez de carros alegóricos em javascript? Ou grandes sumtórios inteiros?

Javascript usa ponto flutuante internamente.

Qual é o valor inteiro mais alto do JavaScript que um Número pode acessar sem perder precisão?

Em outras palavras, você não pode usar mais de 53 bits. Em algumas implementações você pode estar limitado a 31.

Tente armazenar os bits em mais de uma variável, use uma string ou obtenha uma biblioteca bignum , ou se você só precisa lidar com inteiros, uma biblioteca de biginteger .

O javascript agora tem suporte experimental para o BigInt .
No momento da escrita, apenas o Chrome suporta isso.

caniuse não tem nenhuma input ainda.

BigInt pode ser usado com um construtor, por exemplo, BigInt(20) ou adicionando n , por exemplo, 20n

Exemplo:

 const max = Number.MAX_SAFE_INTEGER; console.log('javascript Number limit reached', max + 1 === max + 2) // true; console.log('javascript BigInt limit reached', BigInt(max) + 1n === BigInt(max) + 2n); // false 

Existem várias bibliotecas Javascript BigInteger que você pode encontrar através do googling. Por exemplo, http://www.leemon.com/crypto/BigInt.html

Não. O Javascript tem apenas um tipo numérico. Você tem que codificar a si mesmo ou usar uma biblioteca de números inteiros grande (e você não pode sobrecarregar operadores aritméticos).

Outra implementação de grande aritmética inteira (também usando BigInt.js) está disponível em http://www.javascripter.net/math/calculators/100digitbigintcalculator.htm . Suporta as operações + – * / assim como o restante, GCD, LCM, fatorial, teste de primality, next prime, prime anterior.

você provavelmente está correndo em um limite de comprimento de bytes no seu sistema. Eu pegaria o array de booleanos, convertendo-o em uma matriz de dígitos binários ([true, false, true] => [1,0,1]), então juntei este array em uma string “101”, então use parseInt (‘101’, 2), e você terá sua resposta.

Aqui está (ainda outro) wrapper em torno do BigInt.js de Leemon Baird

Ele é usado nesta demonstração on – line de uma calculadora grande em JavaScript que implementa as quatro operações usuais + – * /, o módulo (%) e quatro funções internas: a raiz quadrada (sqrt), a potência (pow), a fatorial recursivo (fato) e um Fibonacci memoizante (fibo).