Représentation des nombres réels
Le problème
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.
représentation "naïve"
>>> 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 (oufloat
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
- le premier bit correspondra au signe du nombre
- les 11 bits suivants correspondront à l'exposant n
- les 52 bits restants coderont la mantisse
norme IEEE 754
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 !)
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
Exemple : si la mantisse est
1001001111000011100000000...
le nombre représenté sera :
1+(1/21+0x1/22+0x1/23+1x1/24+0x1/25+0x1/26+...)
=1+(1/2+1/24+1/27+1/28+1/29+1/210+1/215+1/216+1/217)
=1,577201843
le nombre représenté sera :
=1+(1/2+1/24+1/27+1/28+1/29+1/210+1/215+1/216+1/217)
=1,577201843
- 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 :
10111111 11100100 00000000 00000000 00000000 00000000 00000000 00000000
01000000 01100000 10000111 01011100 00101000 11110101 11000010 10001111
Du nombre réel vers la représentation
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): 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
Codons le nombre 0,1 selon la norme IEEE754 :
0 01111111011 1001100110011001100110011001100110011001100110011010
- 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
- La suite est dans le tableau ci-dessous.
mantisse de 0,1
A vos crayons ! vous devez trouver le codage des deux
réels suivants :
- 0.25 (assez facile)
- 1/3 (un peu plus difficile)