web-dev-qa-db-fra.com

le plus grand entier qui peut être stocké dans un double

Quel est le plus grand nombre entier "non flottant" pouvant être stocké dans un type double IEEE 754 sans perte de précision?

203
Franck Freiburger

L'entier le plus grand/le plus grand pouvant être stocké dans un double sans perte de précision est identique à la plus grande valeur possible d'un double. C’est-à-dire DBL_MAX ou environ 1,8 × 10308 (si votre double est un double IEEE 754 64 bits). C'est un entier. C'est représenté exactement. Que veux-tu de plus?

Allez, demandez-moi quel est le plus grand nombre entier, de sorte que et tous les plus petits puisse être stocké dans les doubles IEEE 64 bits sans perte de précision. Un double IEEE 64 bits a 52 bits de mantisse, donc je pense que c'est 253:

  • 253 + 1 ne peut pas être stocké, car le 1 au début et le 1 à la fin comportent trop de zéros entre les deux.
  • Moins que 253 peut être stocké, avec 52 bits explicitement stockés dans la mantisse, puis l’exposant vous en donne un autre.
  • 253 évidemment peut être stocké, car c'est une petite puissance de 2.

Ou une autre façon de voir les choses: une fois que le biais a été éliminé de l'exposant et en ignorant le bit de signe comme étant sans importance pour la question, la valeur stockée par un double est une puissance de 2, plus un entier de 52 bits multiplié par 2exposant - 52. Donc, avec l’exposant 52, vous pouvez stocker toutes les valeurs de 252 jusqu'à 253- 1. Puis avec l'exposant 53, le nombre suivant que vous pouvez enregistrer après 253 est 253 + 1 × 253 - 52. Donc, la perte de précision survient d'abord avec 253 +1.

466
Steve Jessop

9007199254740992 (c'est-à-dire 9 007,199,254,740,992) sans aucune garantie :)

Programme

#include <math.h>
#include <stdio.h>

int main(void) {
  double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
  while (dbl + 1 != dbl) dbl++;
  printf("%.0f\n", dbl - 1);
  printf("%.0f\n", dbl);
  printf("%.0f\n", dbl + 1);
  return 0;
}

Résultat

 9007199254740991 
 9007199254740992 
 9007199254740992 
68
pmg

Wikipedia a ceci à dire dans le même contexte avec un lien vers IEEE 754 :

Sur un système informatique typique, un nombre à virgule flottante binaire "double précision" (64 bits) a un coefficient de 53 bits (dont un est implicite), un exposant de 11 bits et un bit de signe.

2 ^ 53 est un peu plus de 9 * 10 ^ 15.

25
Carl Smotricz

Le plus grand entier pouvant être représenté dans IEEE 754 double (64 bits) est identique à la plus grande valeur que le type puisse représenter, car cette valeur est elle-même un entier.

Ceci est représenté par 0x7FEFFFFFFFFFFFFF, qui est composé de:

  • Le bit de signe 0 (positif) plutôt que 1 (négatif)
  • L'exposant maximum 0x7FE (2046 qui représente 1023 après soustraction du biais) plutôt que 0x7FF (2047 qui indique une NaN ou un infini).
  • La mantisse maximale 0xFFFFFFFFFFFFF qui est 52 bits tous 1.

En binaire, la valeur est le 1 implicite suivi de 52 autres de la mantisse, puis de 971 zéros (1023 - 52 = 971) de l’exposant.

La valeur décimale exacte est:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

Ceci est environ 1,8 x 10308.

15
Simon Biber

Vous devez regarder la taille de la mantisse. Un nombre à virgule flottante IEEE 754 64 bits (qui a 52 bits, plus 1 implicite) peut représenter exactement des entiers avec une valeur absolue inférieure ou égale à 2 ^ 53.

8
Dolphin
5
Jay

DECIMAL_Dig de <float.h> devrait donner au moins une approximation raisonnable de cela. Étant donné que cela concerne les chiffres décimaux, et qu’il est vraiment stocké en binaire, vous pouvez probablement stocker quelque chose un peu plus grand sans perdre en précision, mais exactement combien est difficile dire. Je suppose que vous devriez pouvoir le comprendre à partir de FLT_RADIX et DBL_MANT_Dig, mais je ne suis pas sûr que je ferais entièrement confiance au résultat.

2
Jerry Coffin