Est-ce qu'un NumberLong est vraiment un nombre entier 64 bits de MongoDB réellement 64 bits?Nombre de MongoDB seulement 54 bits signés?
On dit que NumberLong de MongoDB est un entier signé de 64 bits, ce qui devrait signifier que nous pouvons jouer avec -2^63 < = x < = 2^63-1, où x est un NumberLong. Cependant, l'ajout de 1 ou la soustraction de 1 d'un NumberLong (x) ne renvoie pas la valeur attendue pour x < = -2^54 ou x> = 2^54, mais les valeurs correctes sont renvoyées pour -2^53 < = x < = 2^53.
Les nombres NumberLong fiables à cet effet semblent être des entiers signés à 54 bits.
Pourquoi est-ce?
Est-ce que je fais quelque chose de mal?
échantillon de la coquille mongo:
> NumberLong(Math.pow(2,54))
NumberLong("18014398509481984") // Expected
> NumberLong(Math.pow(2,54)-1)
NumberLong("18014398509481984") // **NOT** Expected
> NumberLong(-Math.pow(2,54))
NumberLong("-18014398509481984") // Expected
> NumberLong(-Math.pow(2,54)+1)
NumberLong("-18014398509481984") // **NOT** Expected
> NumberLong(Math.pow(2,53))
NumberLong("9007199254740992") // Expected
> NumberLong(Math.pow(2,53)-1)
NumberLong("9007199254740991") // Expected
> NumberLong(-Math.pow(2,53))
NumberLong("-9007199254740992") // Expected
> NumberLong(-Math.pow(2,53)+1)
NumberLong("-9007199254740991") // Expected
En utilisant MongoDB 2.0.0
Votre réflexion sur la mantisse flottante expliquerait tout cela. Malheureusement, les entiers de décalage gauche ne fonctionnent que pour 32 bits signés et la multiplication répétée donne la même sortie que celle mentionnée ci-dessus. – fsto