Académique Documents
Professionnel Documents
Culture Documents
L'avantage de la représentation en virgule flottante par rapport à la virgule fixe est que la virgule flottante
est capable, à nombre de bits égal, de gérer un intervalle de nombres réels plus important.
Par exemple, une représentation décimale en virgule fixe ayant 7 chiffres décimaux dont 2 chiffres après la
virgule peut représenter les nombres 12345.67, 123.45, 1.23, etc. La représentation décimale en virgule
flottante (comme le format IEEE 754 decimal32) peut quant à elle, avec sept chiffres décimaux, représenter
en plus 1.234567, 123456.7 = 1.234567 × 105, 0.00001234567 = 1.234567 × 10−5, 1234567000000000 =
1.234567 × 1015, etc.
En revanche, le format à virgule flottante occupe un peu plus de place, car il est nécessaire d'encoder la
position de la virgule (représentée par l'exposant). Pour le même espace disponible, la virgule flottante offre
donc une étendue de nombres plus grande au détriment de la précision.
En pratique, l'ensemble des nombres réels qui peuvent effectivement être représentés sous la forme d'un
nombre flottant, ou ensemble des flottants, est un ensemble fini. Cet ensemble n'est totalement défini que
lorsque la base de représentation et le nombre de chiffres pour la mantisse, appelé précision, sont choisis
et explicités, ce que réalise la norme IEEE 754 présentée plus loin. Ce double choix définit à la fois
l'ensemble des flottants de travail particulier et la règle de représentation effective.
L'ensemble des flottants n'est pas stable sous l'action des opérations arithmétiques usuelles. La stabilité est
retrouvée quand s'y ajoute une opération de reprojection dans l'ensemble des flottants, par arrondi selon la
fonction d'arrondie choisie, ou mode d'arrondi. Ceci permet de définir une arithmétique en virgule flottante,
pour laquelle l'ensemble des flottantes redevient stable.
Un concept important est la notion d'epsilon, défini de manière usuelle par la différence entre 1 et son
successeur dans l'ensemble des flottants. Il est directement lié à la précision du système à virgule flottante
considéré.
Les deux formats fixés par la norme IEEE 754 sont sur 32 bits (« simple précision », renommé binary32
4
dans la révision de 2008 ) et 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 :
Chiffres
Précision Encodage Signe Exposant Mantisse Valeur d'un nombre Précision
significatifs
Simple
32 bits 1 bit 8 bits 23 bits 24 bits environ 7
précision
Double
64 bits 1 bit 11 bits 52 bits 53 bits environ 16
précision
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
binades (en) ou 76 décades.
Cette norme a été révisée dans les années 2000 [réf. nécessaire] pour aboutir à la publication d'une nouvelle
4
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 option de double
5
précision automatique [source insuffisante] qui force tous les flottants d'un programme à la double précision
et dispense d'une revue fastidieuse pouvant entraîner des erreurs.
Certaines implémentations ajoutent un ou plusieurs formats de précision supérieure ; ainsi, IA-32 et IA-64
ont un format étendu sur 80 bits. La norme IEEE 754-1985 prévoit des tailles minimales pour ces formats
étendus :
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).
En arithmétique en virgule flottante IEEE, un calcul peut aboutir à des valeurs qui ne correspondent pas à
des nombres réels :
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.
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.
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 (0,999+0,0004)+0,0004 = 0,999 +
0,0004 = 0,999 mais 0,999+(0,0004+0,0004)=0,999+0,0008 = 1,000 ; 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.
Dès 1914, L. Torres y Quevedo cherchait à mettre au point une version électromécanique de la machine
6, 7
analytique de Charles Babbage et imagina d'exécuter les calculs en virgule flottante .
Vingt-cinq ans plus tard (en 1938), Konrad Zuse parachevait son premier calculateur mécanique
8
programmable binaire, le Z1 ; cet appareil utilisait lui aussi une représentation en virgule flottante sur 24
bits, avec un exposant signé codé sur 7 bits, une mantisse codée sur 16 bits (dont un bit implicite), et un bit
de signe. Le calculateur Z3 à relais (1941), plus fiable, introduisait la notion de quantité infinie (positive ou
négative) ∞ ; cela permettait de donner des résultats infinis, comme ceux résultant d'opérations telles que
, et il interrompait les calculs lorsqu'ils portaient sur des indéterminations, comme . Zuse
se proposait de gérer tous les calculs arithmétiques faisant intervenir et les indéterminations (NaN),
anticipant ainsi avec quarante ans d'avance des conventions qui seront intégrées à la norme américaine
9
IEEE . Simultanément, le mathématicien von Neumann s'opposait au contraire à l'introduction du calcul en
9
virgule flottante pour la Machine IAS (1951).
Le premier calculateur commercial disposant d'un organe de calcul en virgule flottante pré-câblé aura été le
Z4 de Zuse, développé entre 1942 et 1945. En 1946, Bell Laboratories mit sur le marché le Mark V, qui met
10
en œuvre une arithmétique en virgule flottante décimale .
Le Pilot ACE, un prototype britannique développé en 1950 au National Physical Laboratory, disposait
d'emblée d'une arithmétique en virgule flottante. 33 de ces ordinateurs furent commercialisés par English
Electric sous le nom de DEUCE. Quoique l’arithmétique fût simplement programmée et non pré-câblée,
l'existence d'une horloge cadencée à 1 MHz rendit les premières années cette machine plus rapide que ses
concurrentes.
L’IBM 704, produit en série, suivit en 1954 ; il amena la notion d'exposant à décalage. Au cours des
décennies suivantes, le recours à une unité arithmétique et logique (UAL) à arithmétique en virgule flottante
micro-câblée (FPU) ne fut plus qu'une spécification optionnelle : les ordinateurs qui disposaient d'un tel
composant étaient dits scientifiques. Le passage des IBM 704 et 7044 aux IBM 360 introduisit de nombreux
problèmes numériques, car la virgule flottante simple précision, ramenée de 36 bits binaire à 32 bits
hexadécimale, devenait souvent critique.
La série 1100/2200 des ordinateurs UNIVAC, apparue sur le marché en 1962, comportait deux
représentations en virgule flottante :
Simple précision: 36 bits, comprenant un bit de signe, 8 bits d'exposant et une mantisse codée sur 27
bits.
Double précision: 72 bits, comprenant un bit de signe, 11 bits d'exposant et une mantisse codée sur 60
bits.
Le Burroughs 6500 (en) utilisait quant à lui une virgule flottante en base 8, en 48 et 96 bits.
Le Control Data 6600 utilisait une virgule flottante binaire 60 bits à mantisse entière.
Sur mini-ordinateur, la virgule flottante resta longtemps programmée. Une unité virgule flottante apparaît
chez DEC sur le PDP11-34a en 1977, et en 1979 sur les 21MXF (en) de Hewlett-Packard.
Ce n'est qu’avec le lancement par Intel du microprocesseur i486, en 1989, que les ordinateurs individuels
furent enfin dotés en standard d'une UAL à virgule flottante micro-câblée (les coprocesseurs
mathématiques x87 étaient préalablement optionnels).
Benchmarks upon Applied Mathematics, Physics and Chemistry' (1951) » [archive], sur Soc. Ind. & Appl. Math.,
15 juillet 1997
10. (en) Brian Randell (dir.), The Origins of Digital Computers : Selected Papers, Berlin; New York, Springer-Verlag,
1973 (réimpr. 3e, 1982), 580 p. (ISBN 3-540-11319-3, lire en ligne [archive]), p. 244
v·m [masquer]
Types de données
Non interprétée Bit · Byte · Trit · Tryte · Mot
Bignum · Complexe (en) · Décimal (en) · Virgule fixe · Virgule flottante · Entier
Numérique
(Non signé (en)) · Intervalle · Rationnel (en)
Texte brut Caractère · Chaîne de caractères
Pointeur Adressage mémoire (Physique · Virtuelle) · Référence
Type algébrique de données (Généralisé) · Tableau · Tableau associatif · Classe ·
Composite (en) Dépendant · Égalité (en) · Inductive (en) · Liste · Objet (Métaobjet) · Option (en) ·
Produit (Enregistrement) · Ensemble (set) · Vecteur · Union (en) (Disjointe)
Booléen · Type vide · Collection · Type énuméré · Exception · Fonction ·
Autres Opaque (en) · Type récursif · Sémaphore · Flux · Top (en) · Type class (en) · Type
unité · Void
Type abstrait · Structure de données · Généricité · Kind (en) (Métaclasse) ·
Articles liés Parametric polymorphism (en) · Primitive data type (en) · Interface · Subtyping (en)
· Type constructor (en) · Conversion de type · Type system (en)
Portail de l’informatique
Droit d'auteur : les textes sont disponibles sous licence Creative Commons attribution, partage dans les mêmes
conditions ; d’autres conditions peuvent s’appliquer. Voyez les conditions d’utilisation pour plus de détails, ainsi que les
crédits graphiques. En cas de réutilisation des textes de cette page, voyez comment citer les auteurs et mentionner la
licence.
Wikipedia® est une marque déposée de la Wikimedia Foundation, Inc., organisation de bienfaisance régie par le
paragraphe 501(c)(3) du code fiscal des États-Unis.