Codage des nombres décimaux
Le codage des nombres décimaux est normalisé. La norme IEEE 754 est adoptée par la majorité des constructeurs.
Pour représenter des nombres réels qui peuvent être signés, on utilise trois zones distinctes dans un mot de 32 bits (simple précision):
- le signe sur 1 bit : égal à 0 si le nombre est positif, égal à 1 dans le cas d'un nombre négatif
- l'exposant sur 8 bits en arithmétique signée
- la mantisse qui ne code que la partie décimale (ensemble des chiffres à droite de la virgule) sur 23 bits.
Signe |
Exposant |
Mantisse |
1 bit |
8 bits |
23 bits |
Calcul du signe :
- 0 si positif
- 1 si négatif
Calcul de la mantisse : la mantisse est normalisée selon la forme 20,2-1, 2-2.... ce qui veut dire que l'on ramène le nombre sous la forme 1,.... mais on ne code pas le 1 avant la virgule car il existe forcément.
Exemple : 3.5
- convertir en binaire : 3,5 = 11,1 (2+1+0.5)
- décaler le résultat pour le ramener à la forme 1, : on obtient 1.11 x 101
- On garde la valeur décimale pour former la mantisse : 1100 0000 0000 0000 0000 000
Calcul de l'exposant :
Il s'agit d'un exposant biaisé à 127 ce qui veut dire qu'on ajoute la valeur de l'exposant à la valeur 127.
Dans l'exemple précédent après décalage on obtenait un exposant à 1 donc 127+1=128
l'exposant devient : 10000000
Exemple 1 : -12,25
Puissances de 2 |
23 |
22 |
21 |
20 |
2-1 |
2-2 |
2-3 |
... |
Valeurs |
8 |
4 |
2 |
1 |
0.5 |
0.250 |
0.125 |
|
12.25 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
- soit 1100,010
- On décale : 1,100010 x 103
- La mantisse est donc 10001000000000000000000
- L'exposant : 127 + 3 =130 : 1000 0010
- Le signe est négatif : 1
- Le résultat est donc 1100 0001 0100 0100 0000 0000 0000 0000 = $C1 44 00 00
Exemple 2 : -0,5
Puissances de 2 |
23 |
22 |
21 |
20 |
2-1 |
2-2 |
2-3 |
... |
Valeurs |
8 |
4 |
2 |
1 |
0.5 |
0.250 |
0.125 |
|
0,5 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
- soit 0,1
- on décale : 1,0 x 10-1
- La mantisse est donc nulle : 00000000000000000000000
- L'exposant : 127-1=126 : 01111110
- Le signe : 1
- Le résultat : 1011 1111 0000 0000 0000 0000 0000 0000 = $BF 00 00 00
Remarque : le codage n'est qu'approximatif compte tenu du fait que la taille de la mantisse est limitée à 23 bits. Le codage de 0,1 par exemple n'est pas fini.