Les numéros sont en JavaScript IEEE-754 double précision en virgule flottante binaire, un format assez compact (64 bits), qui fournit pour des calculs rapides et un vaste éventail. Il le fait en stockant le nombre comme un bit de signe, 11 bits d'exposant et 52 bits significande (bien que grâce à l'astuce c'est de 53 bits de précision). C'est binaire (base 2) virgule flottante: Le significande (plus une certaine intelligence) nous donne la valeur, et l'exposant nous donne l'ampleur du nombre.
Naturellement, avec autant de bits significatifs, et pas à chaque numéro peut être stockée. Ici est le nombre 1, et le plus grand nombre après le 1er que le format de magasin, 1 + 2-52 ≈ 1.00000000000000022, et le suivant le plus élevé après que 1 + 2 × 2-52 ≈ 1.00000000000000044:
+--------------------------------------------------------------- bit de signe
/ +-------+------------------------------------------------------ exposant
/ / | +-------------------------------------------------+- significande
/ / | / |
0 01111111111 0000000000000000000000000000000000000000000000000000
= 1
0 01111111111 0000000000000000000000000000000000000000000000000001
≈ 1.00000000000000022
0 01111111111 0000000000000000000000000000000000000000000000000010
≈ 1.00000000000000044
Notez que le saut de 1.00000000000000022 à 1.00000000000000044; il n'y a aucun moyen de stocker 1.0000000000000003. Ce qui peut arriver avec des entiers: Number.MAX_SAFE_INTEGER
(9,007,199,254,740,991) est la plus haute valeur entière positive que le format peut contenir où i
et i + 1
sont à la fois exactement représentable (spec). Les deux 9,007,199,254,740,991 et 9,007,199,254,740,992 peut être représenté, mais la prochaine entier, 9,007,199,254,740,993, ne le peuvent pas; nombre entier le plus proche, nous pouvons représenter après 9,007,199,254,740,992 est 9,007,199,254,740,994. Voici les modèles de bits, la note la plus à droite (le moins significatif) bits:
+--------------------------------------------------------------- bit de signe
/ +-------+------------------------------------------------------ exposant
/ / | +-------------------------------------------------+- significande
/ / | / |
0 10000110011 1111111111111111111111111111111111111111111111111111
= 9007199254740991 (en Nombre.MAX_SAFE_INTEGER)
0 10000110100 0000000000000000000000000000000000000000000000000000
= 9007199254740992 (en Nombre.MAX_SAFE_INTEGER + 1)
x xxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
9007199254740993 (en Nombre.MAX_SAFE_INTEGER + 2) ne peuvent pas être stockés
0 10000110100 0000000000000000000000000000000000000000000000000001
= 9007199254740994 (en Nombre.MAX_SAFE_INTEGER + 3)
Rappelez-vous, le format de la base 2, et en exposant le bit le moins significatif n'est plus fractionnaire; il a une valeur de 2. Il peut être désactivé (9,007,199,254,740,992) ou sur (9,007,199,254,740,994); donc, à ce moment, nous avons commencé à perdre de précision, même au nombre entier (integer) de l'échelle. Qui a des implications pour notre boucle!