Question

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 :

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

Plus précisément, je ne m'intéresse qu'à la plage de nombres 16 bits et 32 ​​bits précis à +/-0,5 (la place des unités) ou +/- 0,0005 (la place des millièmes).

Était-ce utile?

La solution

Pour une donnée IEEE-754 nombre à virgule flottante X, si

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

puis la distance de X au prochain plus grand nombre à virgule flottante représentable (épsilon) 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 souhaitez une précision de +/-0,5 (ou 2^-1), la taille maximale que peut avoir le nombre est de 2^10.Tout nombre supérieur à cette valeur et la distance entre les nombres à virgule flottante est supérieure à 0,5.

    Si vous souhaitez une précision de +/-0,0005 (environ 2^-11), la taille maximale que peut avoir le nombre est de 1.Si cette valeur est supérieure, la distance entre les nombres à virgule flottante est supérieure à 0,0005.

  • Pour simple précision...

    Si vous souhaitez une précision de +/-0,5 (ou 2^-1), la taille maximale que peut avoir le nombre est de 2^23.Tout nombre supérieur à cette valeur et la distance entre les nombres à virgule flottante est supérieure à 0,5.

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

  • Pour double precision...

    Si vous souhaitez une précision de +/-0,5 (ou 2^-1), la taille maximale que peut avoir le nombre est de 2^52.Tout nombre supérieur à cette valeur et la distance entre les nombres à virgule flottante est supérieure à 0,5.

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

Autres conseils

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

  • Chaque deuxième entier compris entre 2 ^ 53 + 2 et 2 ^ 54 peut être représenté exactement.
  • Chaque quatrième entier compris entre 2 ^ 54 + 4 et 2 ^ 55 peut être représenté exactement.
  • Chaque huitième entier compris entre 2 ^ 55 + 8 et 2 ^ 56 peut être représenté exactement.
  • Chaque seizième entier compris entre 2 ^ 56 + 16 et 2 ^ 57 peut être représenté exactement.
  • Chaque 32ème entier compris entre 2 ^ 57 + 32 et 2 ^ 58 peut être représenté exactement.
  • Chaque 64ème entier compris entre 2^58 + 64 et 2^59 peut être représenté exactement.
  • Chaque 128ème entier compris entre 2^59 + 128 et 2^60 peut être représenté exactement.
  • Chaque 256ème entier compris entre 2^60 + 256 et 2^61 peut être représenté exactement.
  • Chaque 512ème entier compris 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, donc le pire des cas d'arrondi est la moitié de l'espacement entre les entiers représentables.

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

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

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

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

Si vous voulez une précision à la place, car vous pouvez représenter chaque 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 ±211.

Si vous voulez un bit après la virgule, vous abandonnez un bit avant, vous avez donc ±210.

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

Le nombre de bits de précision dont vous avez besoin après la virgule décimale dépend entièrement des calculs que vous effectuez et du nombre que vous effectuez.

  • 210 = 1,024
  • 211 = 2,048
  • 223 = 8,388,608
  • 224 = 16,777,216
  • 253 = 9 007 199 254 740 992 (double précision)
  • 2113 = 10 384 593 717 069 655 257 060 992 658 440 192 (quad-précision)

Voir également

Voir IEEE 754-1985:

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

Remarque (1 + fraction).Comme @bendin soulignez qu'en utilisant la virgule flottante binaire, vous ne pouvez pas exprimer de simples valeurs décimales telles que 0,1.L'implication est que vous pouvez introduire des erreurs d'arrondi en effectuant des ajouts simples plusieurs fois ou en appelant des choses comme la troncature.Si vous êtes intéressé par une quelconque précision, la seule façon d'y parvenir est d'utiliser une décimale à virgule fixe, qui est essentiellement un nombre entier mis à l'échelle.

Si je comprends bien votre question, cela dépend de votre langue.
Pour C#, consultez la réf MSDN.Float a une précision à 7 chiffres et une double précision à 15-16 chiffres.

Il m'a fallu un certain temps pour comprendre qu'en utilisant des doubles en Java, je ne perdais pas beaucoup de précision dans les calculs.la virgule flottante a en fait une très bonne capacité à représenter des nombres avec une précision tout à fait raisonnable.La précision que je perdais était immédiatement après la conversion décimal numéros saisis par les utilisateurs dans le binaire représentation à virgule flottante prise en charge nativement.J'ai récemment commencé à convertir tous mes nombres en BigDecimal.BigDecimal demande beaucoup plus de travail à gérer dans le code que les flottants ou les doubles, car ce n'est pas l'un des types primitifs.Mais d’un autre côté, je pourrai représenter exactement les chiffres saisis par les utilisateurs.

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