Favicon

NSI Vaugelas - Première

Connexion

Sommaire

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 : 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".
ieee754 naïve

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...
ieee754

norme IEEE 754

Les 64 bits disponibles sont découpés de la façon suivante : Avec ces trois informations on peut recontruire le nombre réel de la façon suivante :
ieee754

norme IEEE 754

Detaillons tout cela.

Le signe

le signe du nombre est très simple :

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 :
mantisse

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 :
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
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

SOLUTION

01000000 01100000 10000111 01011100 00101000 11110101 11000010 10001111

SOLUTION

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):
conversion

tableau d'aide à la conversion

L'algorithme est le suivant :
  1. Déterminer le premier bit grâce au signe du nombre
  2. Repérer dans le tableau ci-dessus le premier nombre inférieur au nombre à coder.
  3. 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.
  4. 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.
  5. Recommancer autant de fois que nécessaire l'opération précédente
  6. 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 : Au final 0.1 est codé par le nombre binaire :
0 01111111011 1001100110011001100110011001100110011001100110011010
A vos crayons ! vous devez trouver le codage des deux réels suivants :
  1. 0.25 (assez facile)
  2. 1/3 (un peu plus difficile)

SOLUTION