web-dev-qa-db-fra.com

Javascript sommant de grands entiers

En javascript, j'aimerais créer le hachage binaire d'un grand tableau booléen (54 éléments) avec la méthode suivante:

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

En bref: il crée le plus petit entier pour stocker un tableau de booléens. Maintenant, mon problème est que javascript utilise apparemment floats par défaut. Le nombre maximum que je dois créer est 2 ^ 54-1, mais une fois que javascript atteint 2 ^ 53, il commence à faire des choses étranges: 

9007199254740992+1 = 9007199254740994

Existe-t-il un moyen d'utiliser des entiers au lieu de floats en javascript? Ou des sommations de grand entier?

17
Raven

Javascript utilise une virgule flottante en interne.

Quelle est la valeur entière la plus élevée en JavaScript à laquelle un Nombre peut aller sans perdre de précision?

En d'autres termes, vous ne pouvez pas utiliser plus de 53 bits. Dans certaines implémentations, vous pouvez être limité à 31. 

Essayez de stocker les bits dans plusieurs variables, utilisez une chaîne ou obtenez un bignum library , ou si vous n’avez besoin que de traiter des entiers, un biginteger library .

19
martona

javascript a maintenant support expérimental pour BigInt .
Au moment de la rédaction de cet article, seul chrome le supporte.

caniuse n'a pas encore d'entrée.

BigInt peut être utilisé avec un constructeur, par ex. BigInt(20) ou en ajoutant n, par ex. 20n

Exemple:

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

4
Razor

Une autre implémentation de l'arithmétique des grands nombres (utilisant également BigInt.js) est disponible sur www.javascripter.net/math/calculators/100digitbigintcalculator.htm . Supporte les opérations + - */ainsi que le reste, GCD, LCM, factoriel, test de primalité, prime suivante, prime précédente. 

1
Alex K

BigInt est ajouté en tant que fonctionnalité native de JavaScript.

typeof 123;
// → 'number'
typeof 123n;
// → 'bigint'

Exemple:

const max = BigInt(Number.MAX_SAFE_INTEGER);
const two = 2n;
const result = max + two;
console.log(result);
// → '9007199254740993'
1
Mahmoud Khaled

Non. Javascript comporte un seul type numérique. Vous devez vous coder vous-même ou utiliser une bibliothèque de grands nombres entiers (et vous ne pouvez même pas surcharger les opérateurs arithmétiques).

1
6502

vous rencontrez probablement une limite de longueur en octets sur votre système. Je prendrais le tableau de booléens, le convertirais en tableau de chiffres binaires ([true, false, true] => [1,0,1]), puis joignais ce tableau en une chaîne "101", puis utilisais parseInt. ('101', 2), et vous aurez votre réponse.

0
Stephen C

Voici encore un autre) wrapper autour du BigInt.js de Leemon Baird

Il est utilisé dans cette démonstration en ligne d’un calculateur de grand entier en JavaScript qui implémente les quatre opérations habituelles + - * /, le module (%), et quatre fonctions intégrées: la racine carrée (sqrt), le pouvoir (pow), le factoriel récursif (fait) et un mémoizing Fibonacci (fibo).

0
YSharp

Il existe différentes bibliothèques Javascript BigInteger que vous pouvez trouver dans Google. par exemple. http://www.leemon.com/crypto/BigInt.html

0
z5h