Connexion élèves

Choisir le(s) module(s) à installer :

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

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 :
  • 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.
  • 0.1

    mantisse de 0,1

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

A retenir :
  • La représentation des réels est une approximation.
  • Cette approximation peut entrainer des erreurs de calcul, il faut en tenir compte quand on programme ! (pensez y quand nous verrons les tests)
  • Vous devez pouvoir retrouver un nombre réel à partir de sa représentation
  • les codages de 0.1 , 0.2 , et 1/3 sont au programme.