Articles

Format à virgule flottante double précision

Le format à virgule flottante binaire double précision est un format couramment utilisé sur les PC, en raison de sa plage plus large que la virgule flottante simple précision, malgré ses performances et son coût en bande passante. Il est communément appelé simplement double. La norme IEEE 754 spécifie un binary64 comme ayant :

  • Bit de signe : 1 bit
  • Exposant : 11 bits
  • Précision significative : 53 bits (52 stockés explicitement)

Le bit de signe détermine le signe du nombre (y compris lorsque ce nombre est nul, qui est signé).

Le champ exposant est un entier non signé de 11 bits de 0 à 2047, sous forme biaisée : une valeur d’exposant de 1023 représente le zéro réel. Les exposants vont de -1022 à +1023 car les exposants de -1023 (tous les 0) et +1024 (tous les 1) sont réservés aux nombres spéciaux.

La précision de significande sur 53 bits donne une précision de 15 à 17 chiffres décimaux significatifs (2-53 ≈ 1,11 × 10-16). Si une chaîne décimale avec au plus 15 chiffres significatifs est convertie en représentation de double précision IEEE 754, puis reconvertie en une chaîne décimale avec le même nombre de chiffres, le résultat final doit correspondre à la chaîne d’origine. Si un nombre à double précision IEEE 754 est converti en une chaîne décimale avec au moins 17 chiffres significatifs, puis reconverti en représentation à double précision, le résultat final doit correspondre au nombre d’origine.

Le format est écrit avec le significand ayant un bit entier implicite de valeur 1 (à l’exception des données spéciales, voir le codage de l’exposant ci-dessous). Les 52 bits de la fraction (F) signifiant apparaissant dans le format mémoire, la précision totale est donc de 53 bits (environ 16 chiffres décimaux, 53 log10(2) ≈ 15,955). Les bits sont disposés comme suit:

Format à double virgule flottante IEEE 754.svg

La valeur réelle supposée par une donnée de double précision de 64 bits avec un exposant biaisé donné e{\displaystyle e}

e

et une fraction de 52 bits est (-1) signe (1. b 51 b 50. . . b 0) 2 × 2 e-1023 {\displaystyle(-1) ^ {\text{signe}} (1.b_{51} b_{50}…b_{0}) _{2}\ fois 2 ^{e-1023}}

(-1) ^{\text{sign}} (1.b_{51} b_{50}...b_{0})_{2}\times 2 ^{e-1023}

ou

(−1) signe(1 + ∑i = 1 52 b 52−i 2−i) × 2 e−1023 {\displaystyle(-1) ^{\text{signe}} \ left(1+\sum_{i = 1}^{52}b_{52-i} 2 ^{-i}\right) \times 2 ^{e-1023}}

(-1) ^{\text{sign}}\left(1+\sum_{i= 1}^{52}b_{52-i}2^{-i}\right)\ times 2^{e-1023}

Entre 252= 4 503 599 627 370 496 et 253 = 9 007 199 254 740 992 les nombres représentables sont exactement les entiers. Pour la plage suivante, de 253 à 254, tout est multiplié par 2, de sorte que les nombres représentables sont pairs, etc. Inversement, pour la plage précédente de 251 à 252, l’espacement est de 0,5, etc.

L’espacement en tant que fraction des nombres dans la plage de 2n à 2n + 1 est de 2n−52.L’erreur d’arrondi relative maximale lors de l’arrondi d’un nombre au plus proche représentable (la machine epsilon) est donc de 2 à 53.

La largeur de 11 bits de l’exposant permet la représentation de nombres compris entre 10-308 et 10308, avec une précision totale de 15-17 chiffres décimaux. En compromettant la précision, la représentation sous-normale permet des valeurs encore plus petites jusqu’à environ 5 × 10-324.

encodingEdit d’exposant

L’exposant binaire à virgule flottante à double précision est codé à l’aide d’une représentation binaire offset, le décalage zéro étant 1023; également connu sous le nom de biais d’exposant dans la norme IEEE 754. Des exemples de telles représentations seraient :

e=00000000001200116=1: 2 1 − 1023 = 2 − 1022 {\displaystyle 2^{1-1023}=2^{-1022}}

{\displaystyle 2^{1-1023}=2^{-1022}}
(smallest exponent for normal numbers)
e =0111111111123ff16=1023: 2 1023 − 1023 = 2 0 {\displaystyle 2^{1023-1023}=2^{0}}

{\displaystyle 2^{1023-1023}=2^{0}}
(zero offset)
e =10000000101240516=1029: 2 1029 − 1023 = 2 6 {\displaystyle 2^{1029-1023}=2^{6}}

{\displaystyle 2^{1029-1023}=2^{6}}
e =1111111111027fe16=2046: 2 2046 − 1023 = 2 1023 {\displaystyle 2^{2046-1023}=2^{1023}}

{\displaystyle 2^{2046-1023}=2^{1023}}
(highest exponent)

The exponents 00016 and 7ff16 have a special meaning:

  • 00000000000200016 is used to represent a signed zero (if F = 0) and subnormals (if F ≠ 0); et
  • 1111111111127ff16 est utilisé pour représenter ∞ (si F = 0) et NaNs (si F ≠ 0),

où F est la partie fractionnaire du significand. Tous les modèles de bits sont un codage valide.

À l’exception des exceptions ci-dessus, l’ensemble du nombre à double précision est décrit par:

(−1) signe × 2 e−1023 × 1. fraction {\displaystyle(-1) ^ {\text{signe}} \ fois 2 ^{e-1023} \ fois 1.{\text {fraction}}}

{\displaystyle(-1) ^{\text{sign}} \ times 2 ^{e-1023}\times 1.{\text {fraction}}}

Dans le cas de sous-normales (e = 0), le nombre à double précision est décrit par :

(− 1) signe × 2 1 − 1023 × 0. fraction = (- 1) signe × 2 – 1022 × 0. fraction {\displaystyle(-1) ^ {\text{signe}} \ fois 2 ^{1-1023} \ fois 0.{\text{fraction}} =(-1) ^ {\text{signe}} \ fois 2^{-1022} \ fois 0.{\text {fraction}}}

{\displaystyle(-1) ^{\text{sign}} \ fois 2 ^{1-1023} \ fois 0.{\text{fraction}} =(-1) ^ {\text{signe}} \ fois 2^{-1022} \ fois 0.{\text {fraction}}}

EndiannessEdit

Cette section est un extrait de Endianness § Virgule flottante
Bien que les processeurs x86 omniprésents d’aujourd’hui utilisent un stockage little-endian pour tous les types de données (entier, virgule flottante), il existe un certain nombre d’architectures matérielles où les nombres à virgule flottante sont représentés sous forme big-endian tandis que les entiers sont représentés sous forme de petit endian. Il existe des processeurs ARM qui ont une représentation à virgule flottante moitié petit-endian, moitié grand-endian pour les nombres à double précision: les deux mots de 32 bits sont stockés dans des registres entiers de type little-endian, mais le plus significatif en premier. Parce qu’il existe de nombreux formats à virgule flottante sans représentation standard « réseau » pour eux, la norme XDR utilise la norme big-endian IEEE 754 comme représentation. Il peut donc sembler étrange que la norme à virgule flottante généralisée IEEE 754 ne spécifie pas l’endianité. Théoriquement, cela signifie que même les données à virgule flottante IEEE standard écrites par une machine peuvent ne pas être lisibles par une autre. Cependant, sur les ordinateurs standard modernes (c.-à-d., implémentant IEEE 754), on peut en pratique supposer que l’endiannité est la même pour les nombres à virgule flottante que pour les entiers, ce qui rend la conversion simple quel que soit le type de données. (Les petits systèmes embarqués utilisant des formats spéciaux à virgule flottante peuvent cependant être une autre affaire.)

Exemples de double précision

0 01111111111 00000000000000000000000000000000000000000000000000002 ≙3FF0 0000 0000 000016 ≙ +20 × 1 = 1

0 01111111111 00000000000000000000000000000000000000000000000000012 ≙3FF0 0000 0000 000116 ≙ +20 × (1 + 2-52) ≈ 1.0000000000000002, the smallest number > 1

0 01111111111 00000000000000000000000000000000000000000000000000102 ≙ 3FF0 0000 0000 000216 ≙ +20 × (1 + 2−51) ≈ 1.0000000000000004

0 10000000000 00000000000000000000000000000000000000000000000000002 ≙ 4000 0000 0000 000016 ≙ +21 × 1 = 2

1 10000000000 00000000000000000000000000000000000000000000000000002 ≙ C000 0000 0000 000016 ≙ −21 × 1 = −2

0 10000000000 10000000000000000000000000000000000000000000000000002 ≙ 4008 0000 0000 000016 ≙ +21 × 1.12 = 112 = 3

0 10000000001 00000000000000000000000000000000000000000000000000002 ≙ 4010 0000 0000 000016 ≙ +22 × 1 = 1002 = 4

0 10000000001 01000000000000000000000000000000000000000000000000002 ≙ 4014 0000 0000 000016 ≙ +22 × 1.012 = 1012 = 5

0 10000000001 10000000000000000000000000000000000000000000000000002 ≙ 4018 0000 0000 000016 ≙ +22 × 1.12 = 1102 = 6

0 10000000011 01110000000000000000000000000000000000000000000000002 ≙ 4037 0000 0000 000016 ≙ +24 × 1.01112 = 101112 = 23

0 01111111000 10000000000000000000000000000000000000000000000000002 ≙ 3F88 0000 0000 000016 ≙ +2−7 × 1.12 = 0.000000112 = 0.01171875 (3/256)

0 00000000000 00000000000000000000000000000000000000000000000000012 ≙ 0000 0000 0000 000116 ≙ +2−1022 × 2−52 = 2−1074
≈ 4.9406564584124654 × 10−324 (Min. subnormal positive double)

0 00000000000 11111111111111111111111111111111111111111111111111112 ≙ 000F FFFF FFFF FFFF16 ≙ +2−1022 × (1 − 2−52)
≈ 2.2250738585072009 × 10−308 (Max. subnormal double)

0 00000000001 00000000000000000000000000000000000000000000000000002 ≙ 0010 0000 0000 000016 ≙ +2−1022 × 1
≈ 2.2250738585072014 × 10−308 (Min. normal positive double)

0 11111111110 11111111111111111111111111111111111111111111111111112 ≙ 7FEF FFFF FFFF FFFF16 ≙ +21023 × (1 + (1 − 2−52))
≈ 1.7976931348623157 × 10308 (Max. Double)

0 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 0000 0000 0000 000016 ≙ +0

1 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 8000 0000 0000 000016 ≙ −0

0 11111111111 00000000000000000000000000000000000000000000000000002 ≙ 7FF0 0000 0000 000016 ≙ +∞ (positive infinity)

1 11111111111 00000000000000000000000000000000000000000000000000002 ≙ FFF0 0000 0000 000016 ≙ −∞ (negative infinity)

0 11111111111 00000000000000000000000000000000000000000000000000012 ≙ 7FF0 0000 0000 000116 ≙ NaN (sNaN on most processors, such as x86 and ARM)

0 11111111111 10000000000000000000000000000000000000000000000000012 ≙ 7FF8 0000 0000 000116 ≙ NaN (qNaN on most processors, such as x86 and ARM)

iv il est possible d’utiliser un encodage alternatif de NaN (un encodage alternatif de NaN)

0 01111111101 01010101010101010101010101010101010101010101010101012=3FD5 5555 5555 555516 ≙ +2-2 × (1 + 2-2 + 2-4 + … +2-52) ≈1/3

0 10000000000 10010010000111111011010101000100010000101101000110002=4009 21FB 5444 2D1816 ≈pi

Les codages de qNaN et sNaN ne sont pas complètement spécifiés dans IEEE 754 et dépendent du processeur. La plupart des processeurs, tels que la famille x86 et les processeurs de la famille ARM, utilisent le bit le plus significatif du champ significand pour indiquer un NaN silencieux; c’est ce qui est recommandé par l’IEEE 754. Les processeurs PA-RISC utilisent le bit pour indiquer une signalisation NaN.

Par défaut, 1/3 arrondit vers le bas, au lieu de vers le haut comme une précision unique, en raison du nombre impair de bits dans le significand.

Plus en détail:

Given the hexadecimal representation 3FD5 5555 5555 555516, Sign = 0 Exponent = 3FD16 = 1021 Exponent Bias = 1023 (constant value; see above) Fraction = 5 5555 5555 555516 Value = 2(Exponent − Exponent Bias) × 1.Fraction – Note that Fraction must not be converted to decimal here = 2−2 × (15 5555 5555 555516 × 2−52) = 2−54 × 15 5555 5555 555516 = 0.333333333333333314829616256247390992939472198486328125 ≈ 1/3

La vitesse d’exécution avec arithmeticEdit à double précision

En utilisant des variables à virgule flottante à double précision et des fonctions mathématiques (par exemple, sin, cos, atan2, log, exp et sqrt) est plus lente que de travailler avec leurs homologues à précision unique. Un domaine de l’informatique où cela pose un problème particulier est le code parallèle exécuté sur des GPU. Par exemple, lors de l’utilisation de la plate-forme CUDA de NVIDIA, les calculs avec une double précision prennent, selon un matériel, environ 2 à 32 fois plus de temps à compléter par rapport à ceux effectués avec une seule précision.

Limites de précision sur les valeurs integredit

  • Les entiers de -253 à 253 (-9007199254740992 à 9007199254740992) peuvent être représentés exactement
  • Les entiers entre 253 et 254 = 18014398509481984 arrondir à un multiple de 2 (nombre pair)
  • Les entiers entre 253 et 254 = 18014398509481984 arrondir à un multiple de 2 (nombre pair)
  • Entiers compris entre 254 et 255 = 36028797018963968 arrondis à un multiple de 4

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *