Logo de kxs.frCours d'informatique pour le lycée et la prépa

Écriture d’un nombre réel

Introduction

1) Calculer 0.1 + 0.2 dans la console de Python. Que constatez-vous ?

0.30000000000000004

Le résultat ne tombe pas juste

Nous allons expliquer cela dans ce TP.

Fonctionnement

Base 10

On écrit naturellement un nombre réel en base 10 mais on oublie parfois le sens de cette écriture. Ainsi lorsqu’on écrit 12.65910 cela signifie :

12.65910 = 1 x 101 + 2 x 100 + 6 x 10-1 + 5 x 10-2 + 9 x 10-3

Il est important de noter ici qu’il est impossible d’écrire avec un nombre fini de chiffres certains réels en base 10 : 1/3, π, √2, …

Base 2

En base 2 le fonctionnement est le même. Prenons l’exemple de 101.10012 :

101.10012 = 1 x 22 + 0 x 21 + 1 x 20 + 1 x 2-1 + 0 x 2-2 + 0 x 2-3 + 1 x 2-4

On verra par la suite qu’il est également impossible d’écrire sur un nombre fini de bits certains réels. Et il y en a plus qu’en base 10.

2) Convertissez 11010.1011102 en base 10.

24 + 23 + 21 + 2-1 + 2-3 + 2-4 + 2-5 = 26.71875

Conversion base 10 → base 2

Pour convertir un nombre à virgule en base 2, il faut suivre la procédure suivante :

3) Prenons l’exemple de 6.3437510.

110.010112

4) Écrivez 12.695312510 en binaire.

1100.10110012

5) Écrivez 0.210 en binaire. Que constatez-vous ?

0.001100110011…2

L'écriture est infinie.

Certains nombres réels comme 0.210 ou 0.110 ne peuvent pas être écrit exactement en base 2. Ce sont donc des valeurs arrondies qui sont stockées dans la machine. Ce n’est pas un bug, mais pour ces raisons il est très important de ne jamais tester l’égalité de deux flottants :

6) Testez 0.2 + 0.1 == 0.3 dans la console Python. Que constatez-vous ?

Python retourne False.

Norme IEE-754

La norme IEE-754 est utilisée dans la plupart des langages pour représenter les nombres à virgule flottante. Ces nombres sont représentés sur 32 bits (simple précision) ou sur 64 bits (double précision). Pour en expliquer le fonctionnement nous utiliserons la représentation sur 32 bits.

Définition

Un nombre binaire peut s’écrire sous la forme suivante (un peu comme en écriture scientifique) :

(-1)s x m x 2(e-d)

Dans une représentation sur 32 bits, voici la répartition :

Répartition des bits dans une représentation 32 bits d'un réel

7) Prenons l’exemple suivant pour comprendre : 1 10000110 10101101100000000000000

  • s = 1 donc le nombre est négatif
  • e = 10000110 = 128 + 4 + 2 = 134
    donc puissance = e - 127 = 134 - 127 = 7
  • m = 1.101011011

On obtient donc :
-1.101011011 x 27 = -11010110.11 = -214.7510

8) Soit le nombre flottant suivant : 0 01111011 10011001100110011001100. Trouver la représentation en base 10 de ce nombre.

  • s = 0 donc le nombre est positif
  • e = 01111011 = 64 + 32 + 16 + 8 + 2 + 1 = 123
    donc puissance = e - 127 = 123 - 127 = -4
  • m = 1.10011001100110011001100

On obtient donc :
1.10011001100110011001100 x 2-4 = 0.00011001100110011001100112 = 0.0999999940395355210

9) Donner la représentation sur 32 bits du nombre -10.12510.

-10.12510 = -1010.0012 = -1.010001 x 23
On a donc :

  • s = 1 car le nombre est négatif
  • e = puissance + 127 = 3 + 127 = 130 = 100000102
  • m = 010001 (à compléter avec des 0)

On obtient donc :
1 10000010 01000100000000000000000

10) Donner la représentation sur 32 bits du nombre 0.2510.

0.2510 = 0.012 = 1 x 2.2
On a donc :

  • s = 0 car le nombre est positif
  • e = puissance + 127 = -2 + 127 = 125 = 011111012
  • m = 0 (à compléter avec des 0)

On obtient donc :
0 01111101 00000000000000000000000