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?
Javascript utilise une virgule flottante en interne.
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 .
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
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.
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'
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).
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.
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).
Il existe différentes bibliothèques Javascript BigInteger que vous pouvez trouver dans Google. par exemple. http://www.leemon.com/crypto/BigInt.html