Vous êtes sur la page 1sur 3

Systèmes de numération

4. Nombres à virgule flottante

4.1 Principe
Avant-propos
Il arrive dans de nombreux domaines que l'intervalle des valeurs numériques pertinentes
soit particulièrement étendu. L'astronomie en est un exemple extrème puisque certains
calculs peuvent faire intervenir simultanément la masse du soleil (i.e. 2.1030kg) et la masse
de l'électron (i.e. 9.10-31kg). Ces deux nombres diffèrent de plus de 60 ordres de grandeur
(1060) !
Des calculs faisant intervenir ces nombres pourraient s'effectuer en précision multiple,
avec par exemple des nombres de 62 digits. Tous les opérandes et tous les résultats
seraient représentés par des nombres de 62 digits. Cependant, la masse du soleil n'est
connue qu'avec une précision de 5 digits, et il n'y a en physique pratiquement aucune
mesure que l'on puisse réaliser avec une précision de 62 digits. Une solution serait alors
d'effectuer les calculs avec une précision de 62 digits et de laisser tomber 50 ou 60 d'entre
eux avant d'annoncer les résultats, mais ceci est coûteux à la fois en espace mémoire et en
temps de calcul.
En fait, ce qu'il faut est un système permettant de représenter des nombres, tel que la taille
de l'intervalle des nombres "exprimables" soit indépendante du nombre de digits
significatifs.
Principes
Le codage utilisé est basé sur la notation scientifique des nombres :
x = m . 10 e

où x est le nombre considéré, m est appelé la mantisse, et e est l'exposant. Pour représenter
de tels nombres il suffit de stocker l'exposant et la mantisse. Ces nombres sont appelés
nombre à virgule flottante, car il possède de nombreuses représentations différentes qui
dépendent uniquement de la position de la virgule :
0.3141592 . 101 = 3.141592 . 100
= 31.41592 . 10-1
= 314.1592 . 10-2
etc...
Cette propriété est plus ennuyeuse que pratique lorsqu'il s'agit d'effectuer des calculs. Pour
éviter ce problème, un nombre à virgule flottante est toujours stocké sous une forme
unique, celle qui revient à n'avoir qu'un seul digit non nul à la gauche de la virgule. Cette
représentation est appelée la forme normalisée. La forme normalisée du nombre ci-dessus
est 3.141592 . 100, car c'est la seule représentation à n'avoir qu'un unique digit non nul à
la gauche de la virgule.

L'intervalle utile (nombres "exprimables") est lié au nombre de digits de l'exposant, tandis
que la précision sous laquelle on connait les nombres est liée au nombre de digits de la
mantisse. En supposant que l'on dispose d'une mantisse sur 3 digits plus le signe, et que
l'exposant soit connu avec 2 digits plus le signe, la droite des réels sera couverte de la
façon suivante :
nombres 0 nombres
négatifs negatifs négatifs | positifs positifs positifs
trop grands exprimables trop petits | trop petits exprimables trop
grands
----------+-------------+-----------+-----------+-------------
+----------->
-9.999 1099 -1.0 10-99 0 1.0 10-99 9.999 1099
Il est important de noter qu'il est impossible de représenter des nombres positifs ou
négatifs "trop grands" ou "trop petits", et que même dans l'intervalle des nombres
"exprimables" il n'est pas possible de représenter tous les réels. L'ensemble des nombres à
virgule flottante ne couvre pas, loin de là, la droite des réels, même dans l'intervalle utile.
Le nombre de nombres à virgule flottante "exprimables" à l'aide d'une représentation
donnée est éventuellement très grand, mais il est fini. Dans l'exemple ci-dessus (i.e. 3
digits pour la mantisse et 2 digits pour l'exposant), il y a seulement
9x10x10x199 = 179.100 nombres positifs et autant de négatifs, plus zéro (soit un total de
358.201 nombres) qui puissent être représentés.
Lorsque le résultat d'un calcul ne peut être directement représenté par le système de
codage utilisé, la solution évidente consiste à utiliser le nombre "exprimable" le plus
proche. Cette approximation est appelée erreur d'arrondi.
Exemples
Généralement les ordinateurs utilisent des représentations en base 2, 4, 8 ou 16 plutôt que
10.
Soit une représentation avec un exposant sur 7 bits en code relatif à 64 (plus un bit de
signe) et une mantisse sur 16 bits en base 2. Quelle est la valeur du nombre dont la
représentation est la suivante ?
0 1010100 . 0000000000011011
/ ------- ----------------
signe exposant mantisse
Le bit de signe est 0 ce qui correspond à un nombre positif. Le code de l'exposant est
84, et sa valeur 84 - 64 = 20. On rappelle qu'en code relatif à 64 :
Code(x) = 64 + x --> x = Code(x) - 64
La mantisse s'interprète de la façon suivante :
0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1
x x x x x x x x x x x x x x x x
2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 2-10 2-11 2-12 2-13 2-14 2-15 2-16

Ce qui donne la valeur suivante au nombre considéré :


x = +220 x (2-12+2-13+2-15+2-16)
= +28 + 27 + 25 + 24
= +16 x (16+8+2+1)
= +432

Cette représentation n'est pas normalisée. La représentation normalisée de ce même


nombre est obtenue en décalant la mantisse 11 fois vers la gauche pour obtenir un bit
de poids fort non nul, et en soustrayant 11 à la valeur de l'exposant. La représentation
correcte est donc :
01001001.1101100000000000
où le bit de signe est toujours 0, et l'exposant est obtenu par :
Code(20-11) = Code(9) = 64 + 9 = 73 = 1001001
Cette représentation s'interprète de la façon suivante :
x = +29 x (2-1+2-2+2-4+2-5)
= +24 x (24+23+21+20)
= +16 x (16+8+2+1)
= +432
Soit maintenant une représentation avec un signe, un exposant sur 7 bits en code
relatif à 64, et une mantisse sur 16 bits en base 16. Quelle est la valeur du nombre
suivant ?
0 1000101.0000 0000 0001 1010
La valeur de l'exposant est 69-64 = 5, et la mantisse vaut :
0.16-1 + 0.16-2 + 1.16-3 + B.16-4
ce qui conduit à :
x = +165 x (16-3+11.16-4)
= +16 x (16+11)
= +432
Cette représentation est à nouveau non normalisée. Celle-ci est obtenue en décalant la
mantisse de 2 digits vers la gauche et en soustrayant 2 à la valeur de l'exposant :
0 1000011.0001 1010 0000 0000
où l'exposant est :
e = 67 - 64 = 3
On peut vérifier pour le plaisir :
x = +163 x (16-1+11.16-2) = +432

Tous droits réservés


Pour tous renseignements, prière de contacter Daniel Muller
Dernière mise à jour le Mercredi 18 mars 1998 17:28:30