Numéro.MAX_SAFE_INTEGER 9007199254740991
Numéro.MAX_VALUE 1.7976931348623157e + 308
Je comprends comment MAX_SAFE_INTEGER
est calculé sur la base de l'arithmétique en virgule flottante en double précision de JavaScript, mais d'où vient cette énorme valeur max? Est-ce le nombre qui vient si vous utilisez les 63 bits pour l'exposant au lieu des 11 bits sécurisés?
Number.MAX_SAFE_INTEGER
est le plus grand entier pouvant être utilisé en toute sécurité dans les calculs.
Par exemple, Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2
est vrai - tout nombre entier supérieur à MAX_SAFE_INTEGER ne peut pas toujours être représenté en mémoire avec précision. Tous les bits sont utilisés pour représenter les chiffres du nombre.
Number.MAX_VALUE
est en revanche le plus grand nombre possible à représenter en utilisant une représentation en virgule flottante double précision. De manière générale, plus le nombre est élevé, moins il sera précis.
Plus d'informations nombres à virgule flottante double précision sur Wikipedia
Les numéros JS sont en interne des nombres flottants de 64 bits (IEEE 754-2008).
MAX_SAFE_INTEGER est le nombre entier maximal pouvant être représenté en toute sécurité dans ce format, ce qui signifie que tous les nombres situés au-dessous de cette valeur (et au-dessus de MIN_SAFE_INTEGER) peuvent être représentés sous forme d'entiers.
MAX_VALUE vient de 2 ^ 1023 (mantisse 11 bits moins signe de mantisse), soit environ 10 ^ 308.
S'agit-il du nombre obtenu si vous utilisez les 63 bits pour l'exposant Au lieu des 11 bits sécurisés?
La mantisse (exposant) est toujours de 11 bits, ce qui est assez surprenant pour 10 ^ 308.
Comme vous le savez, le javascript a le type Number, mais pas un entier. Entier apparaît par la fonction ducktyping
en javascript. Donc Number.MAX_SAFE_INTEGER
<Number.MAX_VALUE
.
Ensemble avec MIN_VALUE
et MIN_SAFE_INTEGER
, définissez la plage de valeurs numériques possibles pour double
et int
lorsque vous utilisez parseFloat(X)
&& parseInt(X)
.
MAX_VALUE
est en double (64 bit)MAX_SAFE_INTEGER
peut utiliser le premier 53 bits d’un double (64 bits)
Fondamentalement, javascript
ne supporte pas longtemps. donc pour nombre entier ses utilisations conteneur entier 32 bits. et pour un nombre supérieur à 32 bits, il conserve le nombre dans un double conteneur dont la partie entière est égale à 53 bits et les 11 autres bits sont des mantisses (conservent les informations d'un nombre à virgule flottante).
Fondamentalement, les nombres en virgule flottante sont représentés par:
digits * 2 ** movement
chiffres a 52 bits, mouvement a 11 bits et tous deux forment un numéro 64 bits (avec 1 bit de signe). Grâce à cela, vous pouvez représenter toutes sortes de nombres comme vous pouvez stocker de très grands nombres (grand mouvement positif), de très petits nombres (grand mouvement négatif) et des entiers (chiffres).
Qu'est-ce que Number.MAX_SAFE_INTEGER?
Les nombres entiers peuvent simplement être représentés avec un mouvement égal à 0, puis les chiffres contiennent le nombre de 52 bits et peuvent contenir jusqu'à 2 ** 53 - 1
nombres (qui est Number.MAX_SAFE_INTEGER
).
Maintenant, pour les grands nombres, vous devez utiliser le mouvement, ce qui signifie essentiellement que vous déplacez les chiffres vers la gauche ou vers la droite, ce qui entraîne une perte de précision.
(Imagine digits
prendrait seulement 8 bits)
number > digits | movement > result
// savely represented
11111111 > 11111111 | 0 > 11111111
// lost the last 1
111111111 > 11111111 | 1 > 111111110
// lost the two last 1s
1111111111 > 11111111 | 10 > 1111111100
Qu'est-ce que Number.MAX_VALUE?
Si vous définissez tous les bits de digits
et tous les bits de movement
, vous obtenez un numéro (2 ** 53 - 1
) qui est déplacé de 2 ** 11
à gauche, et qui est le plus grand nombre pouvant être stocké dans le 64 bits, tout ce qui est plus grand est Infinity
.