Vous savez maintenant comment représenter les nombres
entiers et les nombres entiers relatifs. Nous allons
devoir maintenant coder des nombres réels. Plusieurs
problèmes se posent à nous :
La représentation décimale de ces nombres peut être
infinie (1/3=0,333333333.....)
En plus des informations numériques et de signe il
va falloir placer la virgule dans ce nombre.
Une première solution "naïve" serait de reprendre le codage
des entiers et de préciser la place de la virgule...Cela
poserait un gros problème de précision...les grands nombres
réels auraient alors très peu de chiffres "après la
virgule".
représentation "naïve"
Mais tout cela ne va pas être simple, pour vous en
convaincre, vous pouvez taper dans un interpréteur Python
l'expression mathématique suivante :
>>> 0.1+0.2-0.3
5.551115123125783e-17
Le résultat est étonnant non ?
Une solution : la norme IEEE 754
La norme la plus employée pour représenter des réels,
appelés aussi nombres à virgule flotante (ou float
en Python) est celle mise au point en 1985 par l'Institute of
Electrical and Electronics Engineers. et comme vous allez
le voir ce n'est pas la solution "naïve" qui a été
choisie !
Il existe une norme sur 32 ou 64 bits, nous nous
intéresserons à cette dernière...
norme IEEE 754
Les 64 bits disponibles sont découpés de la façon suivante
:
le premier bit correspondra au signe du nombre
les 11 bits suivants correspondront à l'exposant n
les 52 bits restants coderont la mantisse
Avec ces trois informations on peut recontruire le nombre
réel de la façon suivante :
norme IEEE 754
Detaillons tout cela.
Le signe
le signe du nombre est très simple :
Si le bit de signe est à 0, le nombre est positif
Si le bit de signe est à 1, le nombre est négatif
L'exposant
Comme vous l'avez vu, la mantisse est multipliée par une
puissance de 2. Les 11 bits de l'exposant codent un nombre
entier n. La puisance de deux correspondante sera n-1023.
Exemple : si l'exposant est 10001000110
sa représentation décimale est 1094
la puissance de 2 est donc 1094-1023=71 (nous allons
coder un très grand nombre !)
La mantisse
La mantisse est codée sur les 52 bits restant. Comme pour
le codage des entiers, plus l'on se déplace vers la
droite, plus les bits sont "de poids faible". On ne
décodera à la main, que les premiers bits de la
mantisse.
La mantisse code toujours un nombre compris entre 1 et 2.
On peut donc l'écrire sous la forme 1,...... Le "1" étant
toujours présent, il n'est pas codé.
Les nombres après la virgules sont codés en puissances
négatives de 2 :
décodage de la mantisse
Mais cette formule n'est surement pas très parlante, nous
allons donc traiter un exemple :
Exemple : si la mantisse est
1001001111000011100000000...
le nombre représenté sera :
Chaque fraction étant multipliée par 0 ou 1 selon la valeur du bit correspondant.
Seule la partie entre parenthèses est codée par la mantisse.
Attention, on remarque ici que malgré la longueur de la
mantisse (52 bits !) la représentation d'un nombre réel
selon cette norme n'est qu'une approximation...
Voila, maintenant vous savez tout ! Il vous reste à traiter
quelques exemples.
De la représentation binaire vers le nombre réel
Dans ce sens c'est le plus simple, vous devez décoder les
nombres ci-dessous :
Là où la tache se complique c'est quand l'on doit partir
du nombre réel et trouver son codage selon la norme
IEEE754. Nous allons voir l'algorithme qui permet ce
codage.L'outil principal est le tableau ci-dessous (si l'image est trop petite, cliquez dessus pour obtenir le fichier ods correspondant):
tableau d'aide à la conversion
L'algorithme est le suivant :
Déterminer le premier bit grâce au signe du nombre
Repérer dans le tableau ci-dessus le premier
nombre inférieur au nombre à coder.
La valeur de n correpondante sera la puissance de
2. Calculer n+1023 puis convertir cette valeur en
binaire, vous avez les 11 bits suivants.
Soustraire la valeur repérée dans le tableau au
nombre à coder puis repérer à nouveau le premier
nombre inférieur au nombre restant, noter 1 dans la
case qui lui correspond, les autres cases restant à 0.
Recommancer autant de fois que nécessaire
l'opération précédente
La mantisse apparait dans le tableau à partir de
la colonne n-1
Comme tout algorithme, il va falloir l'observer sur un
exemple pour bien le comprendre :
Codons le nombre 0,1 selon la norme IEEE754 :
Le signe est positif, le premier bit est à 0.
Dans le tableau ci-dessus, la première valeur
inéfrieure à 0,1 est 0,0625 pour n=-4. L'exposant est
donc 1023+(-4)=1019 soit en binaire sur 11 bits 01111111011