Pour plus de clarté, si j'utilise un langage qui implémente les flottants IEE 754 et que je déclare:
float f0 = 0.f;
float f1 = 1.f;
... puis réimprimez-les, j'obtiendrai 0,0000 et 1,0000 - exactement.
Mais IEEE 754 n'est pas capable de représenter tous les nombres le long de la ligne réelle. Proche de zéro, les «écarts» sont petits; à mesure que vous vous éloignez, les écarts se creusent.
Donc, ma question est: pour un float IEEE 754, quel est le premier entier (le plus proche de zéro) qui ne peut pas être représenté exactement? Je ne suis vraiment concerné que par les flottants 32 bits pour le moment, même si je serai intéressé d'entendre la réponse pour 64 bits si quelqu'un la donne!
Je pensais que ce serait aussi simple que de calculer 2 bits_of_mantissa et d'ajouter 1, où bits_of_mantissa est le nombre de bits que la norme expose. Je l'ai fait pour les flottants 32 bits sur ma machine (MSVC ++, Win64), et cela semblait bien, cependant.
la source
Réponses:
2 bits de mantisse + 1 + 1
Le +1 dans l'exposant (bits de mantisse + 1) est dû au fait que, si la mantisse contient
abcdef...
le nombre qu'elle représente en fait1.abcdef... × 2^e
, il fournit un bit de précision implicite supplémentaire.Par conséquent, le premier entier qui ne peut pas être représenté avec précision et qui sera arrondi est:
Pour
float
, 16 777 217 (2 24 + 1).Pour
double
9 007 199 254 740 993 (2 53 + 1).la source
float
et l' ai fixé à 16 777 217. Mais quand je l'ai imprimé en l'utilisant,cout
il en a résulté 16 777 216. J'utiliseC++
. Pourquoi ne puis-je pas obtenir 16 777 217?(1 << std::numeric_limits<float>::digits) + 1
, et en C,(1 << FLT_MANT_DIG) + 1
. Le premier est sympa car il peut faire partie d'un modèle. N'ajoutez pas le +1 si vous voulez juste le plus grand entier représentable.La plus grande valeur représentable par un entier de n bits est 2 n -1. Comme indiqué ci-dessus, a
float
a 24 bits de précision dans le significande, ce qui semble impliquer que 2 24 ne rentre pas.Cependant .
Les puissances de 2 dans la plage de l'exposant sont exactement représentables comme 1,0 × 2 n , donc 2 24 peut s'adapter et par conséquent le premier entier non représentable pour
float
est 2 24 +1. Comme indiqué ci-dessus. Encore.la source