Nous avons vu, dans la partie précédente, comment notre ordinateur pouvait stocker des nombres relatifs (c'est-à-dire pouvant être positifs ou négatifs). Mais nous ne nous arrêterons pas en si bon chemin ! Voyons maintenant quelle méthode utiliser pour stocker des nombres réels (à virgule). Comme pour les nombres relatifs, l'ordinateur se sert des déclarations de variables, pour différencier un nombre réel d'un nombre entier ; en effet, nous utilisons des types de variables différents pour chaque type de nombre que nous souhaitons utiliser (réel relatif, réel non signé, entier...).
Mais avant toutes choses, qu'est-ce qu'un nombre réel ?
Il s'agit d'un nombre possédant une virgule et pouvant s'écrire, sous la forme :
X.XXX...*10^n où X est bien entendu compris entre 0 et 9 pour
le système décimal,
et sous la forme :
1.XXX...*2^n où X est compris entre 0 et 1 pour
le système binaire.
Et sans plus attendre, voici la méthode utilisée pour représenter des nombres réels sur 32 bits (
float) :
seeeeeeeemmmmmmmmmmmmmmmmmmmmmm.
Comme vous le découvrez, cette méthode se propose de coder le nombre sur 32 bits en définissant trois composantes :
- le signe
s représenté par un seul bit, le bit de poids fort ;
- l'exposant
e codé sur les 8 bits consécutifs au signe ;
- la mantisse
m (les bits situés après la virgule) sur les 23 bits restants.
Mais ce n'est pas tout ! En effet, certaines conditions sont à respecter pour les exposants :
- l'exposant 00000000 est interdit (en effet, n^0 vaudra toujours 1) ;
- l'exposant 11111111 est interdit. En effet, on s'en sert pour signaler des erreurs, on appelle alors cette configuration de nombre NaN, ce qui signifie
Not a Number ;
- il faut rajouter 127 (01111111) à l'exposant pour une conversion de décimal vers un nombre réel binaire.
Un exemple pour que ça soit plus clair, prenons le nombre 525.5 :
- 525.5 est positif donc le premier bit sera 0 ;
- sa représentation en binaire est la suivante : 1000001101.1.

Ne faites pas cette tête, c'est pourtant très simple, il suffit de représenter le nombre comme une somme :
valeur du bit * 2^(
poids du bit) :
525.5 =
1000001101.1
=
1*
2^9 +
0*
2^8 +
0*
2^7 +
0*
2^6 +
0*
2^5 +
0*
2^4 +
1*
2^3 +
1*
2^2 +
0*
2^1 +
1*
2^0 +
(.) 1*
2^-1
=
512 +
0 +
0 +
0 +
0 +
0 +
8 +
4 +
0 +
1 +
0.5
=
525.5 > on retombe donc bien sur nos pieds !
- En normalisant, on trouve : 1.0000011011*2^9.
- On ajoute 127 à l'exposant qui vaut 9 ce qui donne 136, soit en binaire : 10001000.
- La mantisse est composée de la partie décimale de 525.5 en base binaire, c'est-à-dire 0000011011.
- Comme la mantisse doit occuper 23 bits, il est nécessaire d'ajouter des zéros pour la compléter :
00000110110000000000000.
Pourquoi je rajoute des zéros à droite et non pas à gauche ? Parce que 1.0000011011 vaut 1.00000110110000000000000 !
- Et pour finir, je mets le
signe, l'
exposant et la
mantisse à la suite.
Ainsi, voici le nombre 525.5 tel qu'il serait stocké dans la mémoire RAM de votre ordinateur :
01000100000000110110000000000000
seeeeeeeemmmmmmmmmmmmmmmmmmmmmm.
Bien entendu, on procède de la même manière pour les nombres négatifs (cette fois-ci, seul le signe change).
Mais voilà, cette méthode n'est vraie que pour une variable de 32 bits (ce qui correspond à un
float) !
Quoi ? Parce qu'en plus il y a une méthode pour chaque type !
Mais non du calme ! Rassurez-vous, la méthode est EXACTEMENT la même pour tous les types, tout ce qui change, c'est le nombre de bits représentant l'exposant et le signe :
float > 4 octets > 1
s 8
e 23
m > 6 chiffres après la virgule ;
double > 8 octets > 1
s 11
e 52
m > 15 chiffres après la virgule ;
long double > 10 octets > 1
s 15
e 64
m > 17 chiffres après la virgule
(en règle générale).
Vous comprenez donc pourquoi tous les types de variables pouvant contenir des nombres réels occupent tous au moins 4 octets (soit 32 bits).