Quel est le plus grand nombre entier "non flottant" pouvant être stocké dans un type double IEEE 754 sans perte de précision?
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:
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.
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
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.
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:
0x7FE
(2046 qui représente 1023 après soustraction du biais) plutôt que 0x7FF
(2047 qui indique une NaN
ou un infini).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.
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.
1,7976931348623157 × 10 ^ 308
http://en.wikipedia.org/wiki/Double_precision_floating-point_format
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.