Javascript additionnant les grands entiers
En javascript, j'aimerais créer le fichier binaire de hachage d'un grand boolean array (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, c'est que le javascript utilise apparemment flotteurs en tant que par défaut. Le nombre maximum que j'ai créer est de 2^54-1, mais une fois que javascript atteint 2^53 il commence à faire des choses bizarres:
9007199254740992+1 = 9007199254740994
Est-il possible d'utiliser des entiers au lieu de flotteurs en javascript? Ou entier sommations?
source d'informationauteur Raven
Vous devez vous connecter pour publier un commentaire.
Javascript utilise à virgule flottante en interne.
Qu'est-ce que JavaScript est plus haute valeur entière d'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 de plus d'une variable, utilisez une chaîne de caractères, ou d'obtenir une bignum bibliothèqueou si vous avez uniquement besoin de traiter avec des nombres entiers, un biginteger bibliothèque.
Il existe différents BigInteger bibliothèques Javascript que vous pouvez trouver par une recherche sur google. par exemple, http://www.leemon.com/crypto/BigInt.html
Pas. Javascript n'a qu'un seul type numérique. Vous avez de code vous-même ou utiliser un grand nombre entier de la bibliothèque (et vous ne pouvez même pas de surcharge d'opérateurs arithmétiques).
Une autre mise en œuvre de grands arithmétique des nombres entiers (également à l'aide de BigInt.js) est disponible à http://www.javascripter.net/math/calculators/100digitbigintcalculator.htm. Prend en charge les opérations+ - * /, ainsi que le reste, PGCD, PPCM, factorielle, test de primalité, prochain premier, précédent le premier.
vous êtes probablement en cours d'exécution dans un octet limite de longueur sur votre système. je prendrais le tableau de booléens, de le convertir à un tableau de chiffres binaires ([true, false, true] => [1,0,1]), puis rejoindre ce tableau en une chaîne de caractères "101", puis utiliser parseInt('101',2), et vous aurez votre réponse.
Voici (encore un autre) wrapper autour de Leemon de Baird BigInt.js
Il est utilisé dans ce démonstration en ligne d'un grand nombre entier calculatrice en JavaScript qui implémente l'habitude de quatre opérations + - * /, le modulo (%), et les quatre fonctions internes : la racine carrée (sqrt), la puissance (pow), la factorielle récursive (les faits) et un memoizing Fibonacci (niveau de fibo).