web-dev-qa-db-fra.com

Quelle est la différence entre JS Number.MAX_SAFE_INTEGER et MAX_VALUE?

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?

21
Daniel Kobe

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

16
iblamefish

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.

8
Ilya

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).

2
Egor Malkevich

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).

1
Fisherman

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 .

0
Jonas Wilms