Question

Quel est le plus grand entier « non flottante » qui peut être stocké dans un type double IEEE 754 sans perte de précision?

Était-ce utile?

La solution

Le plus grand / plus grand entier qui peut être stocké dans un double sans perte de précision est la même que la plus grande valeur possible d'un double. Autrement dit, DBL_MAX ou environ 1,8 x 10 308 (si votre double est à un IEEE 754 à double 64 bits). Il est un entier. Il est représenté exactement. Que voulez-vous?

Allez, demandez-moi ce que le plus grand entier est, tel que et tous les entiers plus petits peut être stocké dans IEEE 64 bits double sans perte de précision. Un IEEE 64 bits double a 52 bits de mantisse, et je pense qu'il est 2 53 :

  • 2 53 + 1 ne peut pas être stocké, parce que le 1 au début et à la 1 à la fin ont trop de zéros entre les deux.
  • Rien de moins de 2 53 peuvent être stockés, avec 52 bits explicitement stockés dans la mantisse, puis l'exposant en effet vous donner un autre.
  • 2 53 peut évidemment être stocké, car il est une petite puissance de 2.

Une autre façon de voir les choses: une fois que la polarisation a été retiré de l'exposant, et en ignorant le bit de signe comme sans incidence sur la question, la valeur stockée par un double est une puissance de 2, plus un nombre entier de 52 bits multiplié par 2 exposant - 52 . Donc, avec l'exposant 52 vous pouvez stocker toutes les valeurs de 2 52 jusqu'à 2 53 - 1. Puis, avec l'exposant 53, le numéro suivant, vous pouvez stocker après 2 53 est égal à 2 53 + 1 × 2 53-52 . Ainsi, la perte de précision se produit d'abord avec 2 53 + 1.

Autres conseils

9007199254740992 (c'est 9,007,199,254,740,992) sans 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

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

  

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

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

Le plus grand nombre entier qui peut être représenté dans la norme IEEE 754 double (64 bits) est le même que la plus grande valeur que le type peut représenter, puisque cette valeur est elle-même un nombre entier.

Ceci est représenté comme 0x7FEFFFFFFFFFFFFF, qui se compose de:

  • Le bit de signe 0 (positive) au lieu de 1 (négatif)
  • L'exposant maximum 0x7FE (2046 1023, qui représente, après la polarisation est soustraite) plutôt que 0x7FF (2047 ce qui indique une NaN ou infini).
  • La 0xFFFFFFFFFFFFF maximale de mantisse qui est 52 bits tous 1.

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

La valeur décimale exacte est:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

est d'environ 1,8 x 10 308 .

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

DECIMAL_DIG de <float.h> doit donner au moins une approximation raisonnable de cela. Depuis qui traite de chiffres décimaux, et il est vraiment stocké en binaire, vous pouvez probablement stocker quelque chose d'un petit plus sans perte de précision, mais exactement combien est difficile à dire. Je suppose que vous devriez être en mesure de le comprendre et de FLT_RADIX DBL_MANT_DIG, mais je ne suis pas sûr que je serais tout à fait confiance dans le résultat.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top