84 votes

Quelle gamme de nombres peut être représentée dans un système IEEE-754 de 16, 32 et 64 bits ?

Je connais un peu la façon dont les nombres à virgule flottante sont représentés, mais pas assez, j'en ai peur.

La question générale est la suivante :

Pour une précision donnée (dans mon cas, le nombre de décimales exactes en base 10), quelle gamme de nombres peut être représentée pour les systèmes IEEE-754 à 16, 32 et 64 bits ?

Plus précisément, je ne suis intéressé que par la gamme des nombres de 16 et 32 bits précis à +/-0,5 (la place des un) ou +/- 0,0005 (la place des millièmes).

5 votes

0 votes

1 votes

@bendin even Un flotteur de 8 bits ou moins existe et est souvent enseigné dans les programmes d'informatique. Il est également utilisé dans Codage de l'ARM isntruction . Il existe également des flottants de 10, 11 et 14 bits.

114voto

gnovice Points 70970

Pour un IEEE-754 nombre à virgule flottante X si

2^E <= abs(X) < 2^(E+1)

alors la distance de X au plus grand nombre à virgule flottante représentable suivant ( epsilon ) est :

epsilon = 2^(E-52)    % For a 64-bit float (double precision)
epsilon = 2^(E-23)    % For a 32-bit float (single precision)
epsilon = 2^(E-10)    % For a 16-bit float (half precision)

Les équations ci-dessus nous permettent de calculer ce qui suit :

  • _Pour demi-précision ..._

    Si vous voulez une précision de +/-0.5 (ou 2^-1), la taille maximale que peut avoir le nombre est 2^10. Plus grande que cela, la distance entre les nombres à virgule flottante est supérieure à 0,5.

    Si vous voulez une précision de +/-0.0005 (environ 2^-11), la taille maximale que peut avoir le nombre est de 1. Plus grande que cela et la distance entre les nombres à virgule flottante est supérieure à 0.0005.

  • _Pour simple précision ..._

    Si vous voulez une précision de +/-0.5 (ou 2^-1), la taille maximale que peut avoir le nombre est 2^23. Plus grande que cela, la distance entre les nombres à virgule flottante est supérieure à 0,5.

    Si vous voulez une précision de +/-0.0005 (environ 2^-11), la taille maximale que peut avoir le nombre est 2^13. Plus grande que cela, la distance entre les nombres à virgule flottante est supérieure à 0,0005.

  • _Pour double précision ..._

    Si vous voulez une précision de +/-0.5 (ou 2^-1), la taille maximale que peut avoir le nombre est 2^52. Plus grande que cela, la distance entre les nombres à virgule flottante est supérieure à 0,5.

    Si vous voulez une précision de +/-0.0005 (environ 2^-11), la taille maximale que peut avoir le nombre est 2^42. Plus grande que cela, la distance entre les nombres à virgule flottante est supérieure à 0,0005.

3 votes

En termes de mètres, cela signifie que, pour une précision de 1m et 1mm respectivement, la demi-précision permet 1km et 1m, la simple précision permet 8Mm et 8km, et la double précision permet 4Pm et 4Tm.

22voto

Rick Regan Points 1810

Pour les entiers à virgule flottante (je donnerai ma réponse en termes de double-précision IEEE), chaque entier entre 1 et 2^53 est exactement représentable. Au-delà de 2^53, les entiers qui sont exactement représentables sont espacés par des puissances croissantes de deux. Par exemple :

  • Chaque deuxième entier entre 2^53 + 2 et 2^54 peut être représenté exactement.
  • Chaque 4ème entier entre 2^54 + 4 et 2^55 peut être représenté exactement.
  • Chaque 8ème entier entre 2^55 + 8 et 2^56 peut être représenté exactement.
  • Chaque 16ème entier entre 2^56 + 16 et 2^57 peut être représenté exactement.
  • Chaque 32ème entier entre 2^57 + 32 et 2^58 peut être représenté exactement.
  • Chaque 64ème entier entre 2^58 + 64 et 2^59 peut être représenté exactement.
  • Chaque 128ème nombre entier entre 2^59 + 128 et 2^60 peut être représenté exactement.
  • Chaque 256ème entier entre 2^60 + 256 et 2^61 peut être représenté exactement.
  • Chaque 512ème entier entre 2^61 + 512 et 2^62 peut être représenté exactement. . . .

Les entiers qui ne sont pas exactement représentables sont arrondis à l'entier représentable le plus proche, de sorte que l'arrondi le plus défavorable est la moitié de l'espacement entre les entiers représentables.

19voto

bendin Points 6651

La précision citée dans le lien de Peter R vers la référence MSDN est probablement une bonne règle de base, mais la réalité est bien sûr plus compliquée.

Le fait que le "point" dans "floating point" est un binaire et non la virgule a une façon de déjouer nos intuitions. L'exemple classique est 0,1, qui nécessite une précision d'un seul chiffre en décimal mais qui n'est pas du tout représentable exactement en binaire.

Si vous avez un week-end à tuer, jetez un œil à Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante . Vous serez probablement particulièrement intéressé par les sections suivantes Précision y Conversion binaire-décimale .

5voto

derobert Points 26258

Tout d'abord, ni l'IEEE-754-2008 ni l'IEEE-1985 n'ont de flottants de 16 bits ; mais il s'agit d'une addition proposée avec un exposant de 5 bits et une fraction de 10 bits. IEEE-754 utilise un bit de signe dédié, donc la plage positive et négative est la même. De plus, la fraction a un 1 implicite devant, donc vous obtenez un bit supplémentaire.

Si vous voulez une précision à l'unité, c'est-à-dire que vous pouvez représenter chaque nombre entier, la réponse est assez simple : L'exposant décale le point décimal vers l'extrémité droite de la fraction. Ainsi, une fraction de 10 bits vous donne ±2 11 .

Si vous voulez un bit après le point décimal, vous renoncez à un bit avant, ce qui donne ±2. 10 .

La précision simple a une fraction de 23 bits, donc vous auriez ±2 24 entiers.

Le nombre de bits de précision dont vous avez besoin après le point décimal dépend entièrement des calculs que vous effectuez et de leur nombre.

  • 2 10 \= 1,024
  • 2 11 \= 2,048
  • 2 23 \= 8,388,608
  • 2 24 \= 16,777,216
  • 2 53 \= 9.007.199.254.740.992 (double précision)
  • 2 113 \= 10,384,593,717,069,655,257,060,992,658,440,192 (quad-precision)

Voir aussi

2voto

Eugene Yokota Points 43213

Ver IEEE 754-1985 :

v = (-1)^sign * s^(exponent-exponent_bias) * (1 + fraction)

Note (1 + fraction). Comme @bendin souligne qu'en utilisant la virgule flottante binaire, vous ne pouvez pas exprimer de simples valeurs décimales telles que 0,1. Cela signifie que vous pouvez introduire des erreurs d'arrondi en effectuant des additions simples de nombreuses fois ou en faisant appel à des techniques comme la troncature. Si vous êtes intéressé par une quelconque précision, la seule façon d'y parvenir est d'utiliser une virgule fixe, qui est en fait un nombre entier mis à l'échelle.

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