Format virgule flottante quadruple précision
En informatique, le format quadruple précision (appelé parfois FP128 ou float128) est un format de nombre (en) binaire en virgule flottante qui occupe 16 octets (128 bits) avec une précision au moins deux fois supérieure à la double précision sur 53 bits.
Cette quadruple précision de 128 bits est conçue pour les applications nécessitant des résultats supérieurs à la double précision[1], et, en tant que fonction principale, permet de calculer les résultats en double précision de manière plus fiable et précise en minimisant les erreurs de dépassement et d'arrondi dans les calculs intermédiaires et les variables scratch. William Kahan, architecte principal de la première version de la norme IEEE 754 sur l'arithmétique en virgule flottante, a noté : « Pour l’instant, le format étendu sur 10 octets est un compromis tolérable entre la valeur de l’arithmétique extra-précise et le coût de sa mise en œuvre pour qu’elle fonctionne rapidement ; très bientôt, deux octets supplémentaires de précision deviendront tolérables, et finalement un format sur 16 octets ... Ce genre d’évolution progressive vers une plus grande précision était déjà visible lorsque la norme IEEE 754 pour l’arithmétique en virgule flottante a été élaborée »[2].
Dans l’IEEE 754-2008 (en), le format binaire 128 bits est officiellement appelé binary128.
Format virgule flottante binaire quadruple précision de l'IEEE 754 : binary128
[modifier | modifier le code]La norme IEEE 754-2008 spécifie un binary128 comme ayant le format suivant :
- Bit de signe : 1 bit
- Largeur de l'exposant : 15 bits
- Précision du significande : 113 bits (112 explicitement stockés)
Le bit de signe détermine le signe du nombre (y compris lorsque ce nombre est nul, car il est signé). « 1 » signifie négatif.
Cela donne une précision de 33 à 36 chiffres décimaux significatifs. Si un nombre décimal ayant au maximum 33 chiffres significatifs est converti au format IEEE 754 quadruple précision, donnant un nombre normalisé, puis reconverti en nombre décimal avec le même nombre de chiffres, le résultat final devrait correspondre à la chaîne originale. Si un nombre IEEE 754 à quadruple précision est converti en un nombre décimal comportant au moins 36 chiffres significatifs, puis reconverti en représentation quadruple, le résultat final doit correspondre au nombre original[3].
Dans ce format, la mantisse est écrite avec un bit de poids fort implicite de valeur 1, sauf si le champ de l'exposant ne contient que des zéros (utilisé pour coder des nombres dénormalisés et les deux zéros). Ainsi, seuls 112 bits du significande apparaissent dans le format mémoire, mais la précision totale est de 113 bits (environ 34 chiffres décimaux : log10(2113) ≈ 34,016) pour les nombres normalisés ; les nombres dénormalisés ont une précision dégradée jusqu’à 1 bit pour la plus petite valeur non nulle. Les éléments sont disposés comme suit :
Codage de l'exposant
[modifier | modifier le code]L'exposant d'un nombre binaire en virgule flottante quadruple précision est codé avec une représentation binaire décalée, le décalage du zéro étant de 16383 ; appelée également exposant biaisé dans la norme IEEE 754.
- Emin = 000116 − 3FFF16 = −16382
- Emax = 7FFE16 − 3FFF16 = 16383
- Exposant biaisé = 3FFF16 = 16383
Par conséquent, comme défini par la représentation binaire biaisée, afin d'obtenir le vrai exposant, le biais de 16383 doit être soustrait de l'exposant stocké.
Les exposants stockés 000016 et 7FFF16 sont interprétés spécialement.
| Exposant | Mantisse = zéro | Mantisse ≠ zéro | Équation |
|---|---|---|---|
| 000016 | 0, −0 | nombres dénormalisés | (−1)bit de signe × 2−16382 × 0.bits de la mantisse2 |
| 000116, ..., 7FFE16 | valeur normalisée | (−1)bit de signe × 2exposant2 − 16383 × 1.bits de la mantisse2 | |
| 7FFF16 | ± ∞ | NaN (silencieux, avertisseur) | |
La plus petite valeur strictement positive (dénormalisée) est 2−16494 ≈ 10−4965 et a une précision de seulement un bit. La plus petite valeur positive normalisée est 2−16382 ≈ 3.3621 × 10−4932 et a une précision de 113 bits, soit ± 2−16494 également. La plus grande valeur représentable est 216384 − 216271 ≈ 1.1897 × 104932.
Exemples de nombres quadruple précision
[modifier | modifier le code]Ces exemples sont donnés en représentation hexadécimale de la valeur en virgule flottante. Elle comprend le bit de signe, l'exposant (biaisé) et la mantisse.
|
0000 0000 0000 0000 0000 0000 0000 000116 = 2−16382 × 2−112 = 2−16494 0000 ffff ffff ffff ffff ffff ffff ffff16 = 2−16382 × (1 − 2−112) 0001 0000 0000 0000 0000 0000 0000 000016 = 2−16382 7ffe ffff ffff ffff ffff ffff ffff ffff16 = 216383 × (2 − 2−112) 3ffe ffff ffff ffff ffff ffff ffff ffff16 = 1 − 2−113 3fff 0000 0000 0000 0000 0000 0000 000016 = 1 (un) 3fff 0000 0000 0000 0000 0000 0000 000116 = 1 + 2−112 4000 0000 0000 0000 0000 0000 0000 000016 = 2 0000 0000 0000 0000 0000 0000 0000 000016 = 0 7fff 0000 0000 0000 0000 0000 0000 000016 = infini 3ffd 5555 5555 5555 5555 5555 5555 555516 ≈ 0,3333333333333333333333333333333333173 4000 921f b544 42d1 8469 898c c517 01b816 ≈ 3,1415926535897932384626433832795027975 |
Par défaut, 1/3 est arrondi en valeur inférieure comme en double précision, à cause du nombre impair de bits dans la mantisse. Les bits au-delà du point d'arrondi sont 0101... ce qui est inférieur à 1/2 unité de plus faible précision.
Arithmétique double-double
[modifier | modifier le code]Une technique logicielle courante pour implémenter une précision quasi quadruple en utilisant des paires de nombres double précision est parfois appelée arithmétique double-double[4],[5],[6]. En utilisant des paires de nombres double précision IEEE avec des mantisses de 53 bits, l’arithmétique double-double fournit des opérations sur des nombres dont la mantisse est d’au moins[4] 2 × 53 = 106 bits (en réalité 107 bits[7] à l’exception de certaines des plus grandes valeurs, en raison de la plage d’exposants limitée), seulement légèrement moins précis que la mantisse de 113 bits de la quadruple précision IEEE. La plage d’un double-double reste essentiellement la même que celle du format double précision car l’exposant a encore 11 bits[4], significativement plus petit que l’exposant 15 bits de la quadruple précision IEEE (une plage de 1,8 × 10308 pour le double-double contre 1,2 × 104932 pour le binary128).
En particulier, une valeur q double-double/quadruple précision dans la technique double-double est représentée implicitement par la somme q = x + y de deux valeurs double précision x et y, chacune fournissant la moitié de la mantisse q[5]. C’est-à-dire que la paire (x, y) est stockée à la place de q, et les opérations sur les valeurs de q (+, −, ×, ...) sont transformées en opérations équivalentes (mais plus complexes) sur les valeurs x et y. Ainsi, l’arithmétique dans cette technique se réduit à une suite d’opérations en double précision ; puisque l’arithmétique double-précision est couramment implémentée en matériel, l’arithmétique double-double est généralement nettement plus rapide que les techniques plus générales d’arithmétique multiprécision[4],[5].
On notera que l’arithmétique double-double présente les caractéristiques particulières suivantes[8] :
- À mesure que la magnitude de la valeur diminue, la quantité de précision supplémentaire diminue également. Par conséquent, le plus petit nombre dans la plage normalisée est moins précis qu'en double précision. Le plus petit nombre avec une précision maximale est 1000...02 (106 zéros) × 2−1074, ou 1.000...02 (106 zéros) × 2−968. Les nombres dont la magnitude est inférieure à 2−1021 n’auront pas de précision supplémentaire par rapport à la double précision.
- Le nombre réel de bits de précision peut varier. En général, la magnitude de la partie d’ordre inférieur du nombre n’est pas supérieure à la moitié de l’ULP de la partie d’ordre supérieur. Si la partie d'ordre inférieur est inférieure à la moitié de l’ULP de la partie d’ordre supérieur, des bits de la mantisse (soit uniquement des 0 ou uniquement des 1) sont impliqués entre la mantisse des nombres d’ordre supérieur et d'ordre inférieur. Certains algorithmes qui reposent sur un nombre fixe de bits dans la mantisse peuvent échouer lorsqu’on utilise des nombres doubles de 128 bits de longueur.
- Pour la raison ci-dessus, il est possible de représenter des valeurs comme 1 + 2−1074, qui est le plus petit nombre représentable supérieur à 1.
En plus de l’arithmétique double-double, il est également possible de générer une arithmétique triple-double ou quad-double si une précision plus élevée est requise sans aucune bibliothèque de virgule flottante de plus grande précision. Elles sont représentées par la somme de trois (ou quatre) valeurs de double précision respectivement. Elles peuvent représenter des opérations avec au moins 159/161 et 212/215 bits respectivement. Une extension naturelle à un nombre arbitraire de termes (bien que limitée par l’étendue des exposants) est appelée développements en virgule flottante.
Une technique similaire peut être utilisée pour produire une arithmétique double-quad, représentée par la somme de deux valeurs quadruple précision. Elle peut représenter des opérations avec au moins 226 (ou 227) bits[9].
Références
[modifier | modifier le code]- ↑ (en) David H. Bailey et Jonathan M. Borwein, « High-Precision Computation and Mathematical Physics »,
- ↑ (en) Nicholas Higham, "Designing stable algorithms" in Accuracy and Stability of Numerical Algorithms (2 ed), SIAM, , 43 p.
- ↑ (en) William Kahan, « Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic » [PDF],
- (en) Yozo Hida, X. Li et D. H. Bailey, Technical Report LBNL-46996, Lawrence Berkeley National Laboratory, (lire en ligne), « Quad-Double Arithmetic: Algorithms, Implementation, and Application ». Also (en) Y. Hida et al., « Library for double-double and quad-double arithmetic », .
- J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates, Discrete & Computational Geometry 18: 305–363, 1997.
- ↑ D. E. Knuth, The Art of Computer Programming, 2nd, chapter 4.2.3. problem 9.
- ↑ Robert Munafo. F107 and F161 High-Precision Floating-Point Data Types (2011).
- ↑ 128-Bit Long Double Floating-Point Data Type
- ↑ sourceware.org Re: The state of glibc libm