vignette|Comme la notation scientifique, le nombre à virgule flottante a une mantisse et un exposant.

La virgule flottante est une méthode d'écriture de nombres fréquemment utilisée dans les ordinateurs (norme IEEE 754) équivalente à la notation scientifique en numération binaire. Elle consiste à représenter un nombre par : un signe (égal à −1 ou 1) ; une mantisse (aussi appelée significande) ; et un exposant (entier relatif, généralement borné).

Un tel triplet représente le nombre

La base de représentation est généralement 2 sur ordinateur, mais aussi 8 ou 16 sur certaines anciennes machines, 10 sur de nombreuses calculatrices, 60 chez les Babyloniens, ou éventuellement toute autre valeur. En faisant varier l'exposant, on fait « flotter » la virgule. La mantisse est une suite de chiffres en base b, généralement de taille fixée. La valeur de l'« exposant » indique le multiplicateur, c'est-à-dire la position de la virgule virtuelle.

Comparaison avec la virgule fixe La virgule flottante s'oppose à la représentation en virgule fixe, qui indique un nombre entier d'un sous-multiple de l'unité : « 1234,567 » est une façon commode d'écrire 1234 et 567 millièmes, soit 1234567 millièmes..

La représentation en virgule flottante peut, avec le même nombre de bits, gérer un intervalle numérique plus important.

La représentation en virgule flottante préserve la précision. La mantisse a toujours le même nombre de chiffres significatifs, sans zéro au début.

La virgule flottante permet de définir une limite de l'erreur d'approximation relative ou epsilon d'une machine.

Cet avantage se paie par l'occupation de plus de place, car il est nécessaire d'encoder la position de la virgule (représentée par l'exposant). Il faut aussi plus de calculs pour effectuer les opérations, qui concernent non plus un nombre entier, mais deux, ou trois si on considère le signe.

Éléments de mathématique des nombres flottants Bien que la notation scientifique et le type de donnée informatique « nombre en virgule flottante » soient issus de la pratique du calcul, leurs particularités ont fait l'objet d'études mathématiques. On doit citer les travaux de William Kahan, parfois surnommé .

Nombres à virgule flottante et nombres réels Quand, comme c'est le cas le plus souvent, on utilise le nombre à virgule flottante dans un calcul, on le considère implicitement comme une approximation d'un nombre réel. La précision de cette approximation est celle de la mantisse, dont le premier chiffre ne peut être zéro que lorsque l'exposant est le plus négatif possible. Le nombre en virgule flottante représente un réel dont la valeur est comprise dans un intervalle autour de la valeur entière de la mantisse, large comme la différence entre deux valeurs consécutives de celle-ci.

D'un point de vue mathématique, la valeur d'une expression numérique en virgule flottante est un ensemble continu de nombres réels, dont les règles d'arrondi définissent précisément les limites.

Contrairement à ce qui se passe dans l'ensemble des nombres réels, l'addition n'est pas associative pour les nombres à virgule flottante., d'où importance de l'ordre de calcul.

De ce fait, le calcul de propagation des incertitudes ne s'applique qu'à celle sur les données. La précision du calcul doit être largement supérieure à l'incertitude.

L'expression d'un nombre dans un système à virgule flottante ne peut pas, en général, s'exprimer exactement dans un autre système à virgule flottante de base différente.

De ce fait, le calcul se fait, chaque fois que c'est possible, sur les nombres entiers : par exemple, sur des centièmes plutôt que sur l'unité monétaire. En changeant d'unité, on évite l'arrondi à la conversion en binaire.

Ensemble des nombres à virgule flottante

L'ensemble des nombres représentés sous la forme d'un nombre flottant, ou ensemble des flottants, est un ensemble fini, dont le dénombrement dépend de la base de représentation et des nombres de chiffres pour la mantisse et l'exposant.

Le nombre de chiffres de la mantisse et la base numérique définissent la précision arithmétique. La différence entre 1 et son successeur dans l'ensemble des flottants définit de manière usuelle l'epsilon d'un système à virgule flottante.

L'ensemble des flottants n'est pas stable sous l'action des opérations arithmétiques usuelles. Il faudrait que le résultat de l'opération soit toujours un élément de l'ensembledéfinition de la stabilité selon ; mais il est fréquent que le résultat d'une opération arithmétique ne puisse s'exprimer avec le même nombre de chiffres que ses opérandes. Pour obtenir la stabilité, on doit y ajouter une fonction d'arrondi.

Mises en œuvre

La vitesse des opérations en virgule flottante, communément appelée FLOPS dans les mesures de performances, est une caractéristique importante des machines, en particulier dans les logiciels qui effectuent des calculs mathématiques à grande échelle.

Au fil du temps, un certain nombre de représentations à virgule flottante a vu le jour, ce qui constituait un frein au portage des programmes de calcul scientifique d'une machine à l'autre, en raison des différences de représentations internes et de comportement des nombres flottants. Pour cette raison, l'IEEE a mis en place une norme en 1985, IEEE 754.

Norme IEEE 754

La norme IEEE 754 de 1985 (reprise par la norme internationale CEI 60559) spécifie deux formats de nombres en virgule flottante (et deux formats étendus optionnels) en base 2, ainsi que quelques opérations associées : principalement l'addition, la soustraction, la multiplication, la division et la racine carrée. La quasi-totalité des architectures d'ordinateurs actuelles, y compris IA-32, PowerPC, et AMD64, incluent une implémentation matérielle des calculs sur flottants IEEE, directement dans le microprocesseur, garantissant une exécution rapide.

Les deux formats fixés par la norme IEEE 754 de 1985 sont :

— 32 bits (« simple précision », renommé « binary32 » dans la révision de 2008Norme IEEE 754-2008) ;

— 64 bits (« double précision », renommé « binary64 » dans la révision de 2008).

La répartition des bits est la suivante, où 1 ≤ M < 2 :

Précision Encodage Signe Exposant Mantisse Valeur d'un nombre Précision Chiffres significatifs Simple précision 32 bits 1 bit 8 bits 23 bits 24 bits environ 7 Double précision 64 bits 1 bit 11 bits 52 bits 53 bits environ 16

Le tableau ci-dessus indique les bits représentés. Le premier bit de la mantisse d'un nombre normalisé étant toujours 1, il n'est représenté dans aucun de ces deux formats : on parle de bit implicite. Pour ces deux formats, les précisions sont donc respectivement de 24 et de 53 bits.

Deux valeurs du champ Exposant sont réservées pour encoder les nombres spéciaux : nombres dénormalisés et zéro signé d'une part, les infinis et les NaN (Not-a-Number) d'autre part. Les autres définissent la dynamique de la représentation : 8 bits permettent de faire varier l'ordre de grandeur sur 256 ou 76 décades.

En plus de la représentation, la norme spécifie exactement le comportement des opérations supportées : celles-ci doivent être correctement arrondies dans un des 4 modes d'arrondi choisi.

Cette norme a été révisée dans les années 2000 pour aboutir à la publication d'une nouvelle version de la norme en 2008. De nouveaux formats ont été définis (« quadruple précision » ou binary128, et des formats décimaux), la notion de format étendu a été généralisée, et de nouvelles opérations ont été ajoutées, comme le FMA ; les principales fonctions élémentaires sont recommandées.

Plusieurs compilateurs de Fortran et d'autres langages peuvent être appelés avec une qui force tous les flottants d'un programme à la double précision. et dispense d'une revue fastidieuse pouvant entraîner des erreurs.

Flottants étendus Certaines implémentations ajoutent un ou plusieurs formats de précision supérieure ; ainsi, IA-32 et IA-64 ont un format étendu sur . La norme IEEE 754-1985 prévoit des tailles minimales pour ces formats étendus : Précision Signe Exposant Mantisse Simple précision étendue 1 bit 11 bits ou plus 32 bits ou plus Double précision étendue 1 bit 15 bits ou plus 64 bits ou plus Ces représentations « étendues » n'utilisent pas forcément le bit implicite de la mantisse.

Dans la pratique, seule la double précision étendue est encore utilisée, dans sa forme minimale (1+15+64 = 80 bits, le format étendu de l'IA32 mentionné plus haut), si on exclut les formats de précision supérieure (comme la double précision en tant que simple précision étendue, et la quadruple précision en tant que double précision étendue).

Exceptions En arithmétique en virgule flottante IEEE, un calcul peut aboutir à des valeurs qui ne correspondent pas à des nombres : NaN (« not a number »), qui sera par exemple le résultat de la tentative de division flottante de zéro par zéro, ou de la racine carrée d'un nombre strictement négatif. Les NaN se propagent : la plupart des opérations faisant intervenir un NaN donnent NaN (des exceptions sont possibles, comme NaN puissance 0, qui peut donner 1). Un infini positif et un infini négatif, qui sont par exemple le résultat d'un débordement en arrondi au plus près.

Précision arbitraire

Lorsque la précision désirée pour le résultat dépasse celle de l'arithmétique en virgule flottante fournie par la machine, on peut devoir recourir à des calculs sur des flottants en précision supérieure. Cela s'avère aussi nécessaire pour effectuer des calculs numériquement instables.

Différentes bibliothèques logicielles, ainsi que la plupart des systèmes de calcul formel, offrent une arithmétique en virgule flottante en précision arbitraire, dans laquelle la taille de la mantisse peut être choisie par l'utilisateur. Citons notamment la bibliothèque GNU MPFR, qui implémente les opérations arithmétiques de base ainsi que de nombreuses fonctions usuelles sur les flottants en base 2 de précision arbitraire. La sémantique des opérations MPFR est inspirée de celle de la norme IEEE-754. En particulier, la bibliothèque garantit l'arrondi correct des résultats.

Précautions d'emploi Les calculs en virgule flottante sont pratiques, mais présentent divers désagréments, notamment : leur précision limitée, qui se traduit par des arrondis (dus aux opérations, ainsi qu'aux changements de base implicites) qui peuvent s'accumuler de façon gênante. En particulier, la soustraction de deux nombres très proches et entachés d'erreur provoque une grande perte de précision relative : on parle de cancellation (plus précisément, cancellation catastrophique) ; une plage d'exposants limitée, autorisant une certaine dynamique, mais pouvant donner lieu au-delà à des débordements (overflows) lorsque le résultat d'une opération est plus grand, en valeur absolue, que la plus grande valeur représentable, et à des sous-passements (underflows), lorsqu'un résultat est plus petit, en valeur absolue, que le plus petit flottant normalisé positif, puis à des résultats n'ayant plus aucun sens.

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 : les calculs en virgule flottante, contrairement aux calculs sur les réels, ne sont pas associatifs. Par exemple, avec une précision relative de 3 chiffres décimaux, on aurait : mais ; on dit qu'il y a absorption lorsqu'un opérande comme 0,999 absorbe ainsi un plus petit non nul ; l'évaluation des expressions est parfois faite en précision étendue, avec retour à la précision normale lors du rangement des valeurs ; dans ce cas, on peut avoir une meilleure précision en éliminant certaines variables intermédiaires peu utiles, et les rangements associés.

Dans une série d'additions, comme celle des valeurs d'un tableau, on peut évaluer l'erreur, et la reporter sur la prochaine addition par l'. L'erreur finale est ainsi beaucoup plus petite.

Développement historique