Virgule flottante
Les nombres à virgule flottante sont les nombres les plus souvent utilisés dans un ordinateur. Ce sont des approximations rationnelles de nombres réels.
Les nombres à virgule flottante possèdent un signe s (dans {-1, 1}), une mantisse entière m (parfois appelée significande) et un exposant e. Un tel triplet représente un réel s.m.be où b est la base de représentation (parfois 2, mais aussi 16 pour des raisons de rapidité de calculs, ou éventuellement toute autre valeur). En faisant varier e, on fait « flotter » la virgule décimale. Généralement, m est d'une taille fixée.
Ceci s'oppose à la représentation dite en virgule fixe, où l'exposant e est fixé.
Les différences de représentation interne des nombres flottants d'un ordinateur à un autre obligeaient à reprendre finement les programmes de calcul scientifique pour les porter d'une machine à une autre jusqu'à ce qu'un format normalisé soit proposé par l'IEEE.
| Sommaire |
Mises en œuvre
Norme IEEE 754
La norme IEEE 754 (reprise par la norme internationale IEC 60559) spécifie deux formats de nombres en virgule flottante et les opérations associées. La quasi-totalité des architectures d'ordinateurs actuelles, y compris IA32, PowerPC, et AMD64, incluent une implémentation matérielle des calculs sur flottants IEEE, directement dans le microprocesseur, garantissant une exécution rapide.
Les flottants IEEE peuvent être codés sur 32 bits (« simple précision ») ou 64 bits (« double précision »). Il est aujourd'hui très rare que des programmes utilisent la simple précision, en tout cas sur station de travail. Certaines implémentations ajoutent un ou plusieurs types de précision supérieure (ainsi, IA32 a un type étendu sur 80 bits). La répartition des bits est la suivante :
| Signe | Exposant | Mantisse | |
| Simple précision | 1 bit | 8 bits | 23 bits |
| Double précision | 1 bit | 11 bits | 52 bits |
La valeur d'un nombre ainsi codé est donc :
(-1)S * (1 + M ) * 2(E-127) pour les nombres codés en simple précision
ou
(-1)S * (1 + M ) * 2(E-1023) pour les nombres codés en double précision
Flottants étendus
Lorsque les flottants IEEE offrent une précision insuffisante, on peut devoir recourir à des calculs sur des flottants en précision supérieure. Citons notamment la bibliothèque MPFR, incluse dans GNU MP.
Précautions d'emploi
Les calculs en virgule flottante sont pratiques, mais présentent trois désagréments :
- leur précision limitée, qui se traduit par des arrondis qui peuvent s'accumuler de façon gênante. Pour cette raison, les travaux de comptabilité ne sont pas effectués en virgule flottante, même pour la fortune personnelle de Bill Gates, car tout doit y tomber juste au centime près.
- une quantisation qui peut être gênante autour du zéro : une représentation flottante posssède une plus grande valeur négative, une plus petite valeur positive, et entre les deux le zéro... mais aucune autre valeur! Que rendre comme résultat quand on divise la plus petit valeur positive par 2 ? 0 est une réponse incorrecte, garder la valeur existante une erreur aussi.
- de effets de « bruit discret » sur les trois derniers bits lorsque l'exposant est une puissance de 16 et non de 2
Il est par exemple tentant de réorganiser des expressions en virgule flottante comme on le ferait d'expressions mathématiques. Cela n'est cependant pas anodin, car les calculs en virgule flottante, contrairement aux calculs sur les réels, ne sont pas associatifs. Par exemple, dans un calcul en flottants IEEE double précision, (1050+1)-1050 ne donne pas 1, mais 0. La raison est que 1050+1 est approximé par 1050.
Une configuration binaire est en générale réservée à la représentation de la « valeur » NaN (« not a number »), qui sera par exemple le résultat de la tentative de division flottante d'un nombre par zéro. NaN combiné avec n'importe quel nombre (y compris NaN), donne NaN.
