195 votes

Quel est le premier entier qu'un float IEEE 754 est incapable de représenter exactement?

Pour plus de clarté, si je suis en utilisant un langage qui met en œuvre IEE 754 flotteurs et je déclare:

float f0 = 0.f;
float f1 = 1.f;

...et de les imprimer ensuite en arrière, je vais obtenir 0.0000 et 1,0000 - exactement.

Mais la norme IEEE 754 n'est pas capable de représenter tous les nombres le long de la ligne réelle. Proche de zéro, les "trous" sont plus petits, comme vous obtenez plus loin, les écarts sont de plus en plus.

Donc, ma question est: pour une norme IEEE 754 flotteur, qui est le premier (le plus proche de zéro) entier qui ne peut pas être représentée exactement? Je ne suis vraiment intéressé à 32 bits flotteurs pour l'instant, même si je serai curieux d'entendre la réponse pour la version 64 bits si quelqu'un le donne!

J'ai pensé que ce serait aussi simple que le calcul des 2bits_of_mantissa et en ajoutant 1, où bits_of_mantissa est cependant nombre de bits de la norme expose. Je l'ai fait pour 32-bit flotte sur ma machine (MSVC++, Win64), et il semble très bien, cependant.

251voto

KennyTM Points 232647

2 bits de mantisse + 1 + 1

Le +1 est parce que si la mantisse contient abcdef... le nombre est en fait 1.abcdef... , ce qui prouve un bit de précision implicite supplémentaire.

Pour float , il est de 16 777 217 (2 24 + 1).
Pour double , il est de 9 007 199 254 740 993 (2 53 + 1).

46voto

thus spake a.k. Points 876

La plus grande valeur représentable par un n bits entier est 2n-1. Comme noté ci-dessus, float a 24 bits de précision dans la significande qui semblerait impliquer que 224 ne rentrait pas.

Cependant.

Des puissances de 2 dans la gamme de l'exposant sont exactement représentable 1,0×2n, donc 224pouvez ajustement et, par conséquent, la première irreprésentable entier pour float 224+1. Comme indiqué ci-dessus. De nouveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X