Aller au contenu

Chapitre 3 : Représentation des nombres réels (flottants)

Programme officiel (B.O.)

B.O. spécial n° 1 du 22 janvier 2019 - NSI Première

Contenus Capacités attendues Commentaires
Représentation approximative des nombres réels : notion de nombre flottant Calculer sur quelques exemples la représentation de nombres réels : 0.1, 0.25 ou 1/3. 0.2 + 0.1 n'est pas égal à 0.3. Il faut éviter de tester l'égalité de deux flottants. Aucune connaissance précise de la norme IEEE-754 n'est exigible.

1. Le problème : les nombres réels en machine

Les entiers se représentent de manière exacte en binaire. Mais les nombres à virgule posent un problème fondamental : il est impossible de représenter tous les nombres réels avec un nombre fini de bits.

En effet, entre deux nombres réels quelconques, il existe une infinité d'autres nombres réels. Avec un nombre fini de bits, on ne peut coder qu'un nombre fini de valeurs. La représentation sera donc forcément approximative dans la plupart des cas.

À retenir

Les nombres à virgule sont stockés dans les ordinateurs sous forme de nombres flottants (floating point numbers en anglais). Cette représentation est approximative : la plupart des nombres à virgule ne peuvent pas être représentés de manière exacte.


2. La notation scientifique : un point de départ

En mathématiques et en sciences, on utilise la notation scientifique pour écrire les très grands ou très petits nombres. Le principe est de séparer le nombre en deux parties :

  • Un nombre compris entre 1 et 10 appelé la mantisse ;
  • Une puissance de 10 appelée l'exposant.
Nombre Notation scientifique Mantisse Exposant
3 750 3,75 × 10³ 3,75 3
0,0042 4,2 × 10⁻³ 4,2 -3
602 200 000 000 000 000 000 000 6,022 × 10²³ 6,022 23

La virgule « flotte » en se déplaçant grâce à l'exposant : c'est l'origine du terme nombre flottant ou virgule flottante.


3. La virgule flottante en binaire

Dans un ordinateur, le même principe est appliqué, mais en base 2. Un nombre flottant est stocké sous la forme :

signe × mantisse × 2^exposant^

L'ordinateur mémorise trois informations dans un nombre fixe de bits :

Composante Rôle
Signe 1 bit : 0 pour positif, 1 pour négatif
Exposant Détermine l'ordre de grandeur (la position de la virgule)
Mantisse Les chiffres significatifs du nombre

Pas de norme à connaître

Le B.O. précise qu'aucune connaissance précise de la norme IEEE-754 n'est exigible. Il suffit de comprendre le principe de la représentation et ses limites.


4. Fractions binaires

Tout comme on peut écrire des nombres à virgule en base 10, on peut le faire en base 2. Les positions après la virgule correspondent aux puissances négatives de 2 :

Position ... 2⁰ , 2⁻¹ 2⁻² 2⁻³ 2⁻⁴ ...
Valeur ... 2 1 , 0,5 0,25 0,125 0,0625 ...

Quelques exemples de conversion

Exemple : convertir 0,75 en binaire

  • 0,75 >= 0,5 = 2⁻¹ ? Oui. On écrit 1. Reste : 0,75 - 0,5 = 0,25.
  • 0,25 >= 0,25 = 2⁻² ? Oui. On écrit 1. Reste : 0.

Résultat : \((0,75)_{10}\) = \((0,11)_2\)

Vérification : 1 × 0,5 + 1 × 0,25 = 0,75 ✓

Exemple : convertir 0,25 en binaire

  • 0,25 >= 0,5 ? Non. On écrit 0.
  • 0,25 >= 0,25 ? Oui. On écrit 1. Reste : 0.

Résultat : \((0,25)_{10}\) = \((0,01)_2\)

Ce nombre se représente exactement en binaire.

Exemple : convertir 0,1 en binaire

  • 0,1 >= 0,5 ? Non. On écrit 0.
  • 0,1 >= 0,25 ? Non. On écrit 0.
  • 0,1 >= 0,125 ? Non. On écrit 0.
  • 0,1 >= 0,0625 ? Oui. On écrit 1. Reste : 0,1 - 0,0625 = 0,0375.
  • 0,0375 >= 0,03125 ? Oui. On écrit 1. Reste : 0,0375 - 0,03125 = 0,00625.
  • Et on continue...

Résultat : \((0,1)_{10}\) = \((0,000110011001100110011...)_2\)

La suite 0011 se répète indéfiniment. Ce nombre ne peut pas être représenté exactement en binaire, quelle que soit la précision.

Méthode systématique : multiplications successives par 2

Pour convertir la partie décimale d'un nombre en binaire, on peut aussi procéder par multiplications successives par 2 en ne gardant que la partie entière à chaque étape :

Méthode appliquée à 0,1

Étape Multiplication Partie entière Partie décimale
1 0,1 × 2 = 0,2 0 0,2
2 0,2 × 2 = 0,4 0 0,4
3 0,4 × 2 = 0,8 0 0,8
4 0,8 × 2 = 1,6 1 0,6
5 0,6 × 2 = 1,2 1 0,2
6 0,2 × 2 = 0,4 0 0,4
... Le cycle recommence ... ...

On lit les parties entières de haut en bas : \((0,1)_{10}\) = \((0,\overline{0001100110011...})_2\)


5. Les erreurs d'arrondi

Puisque la mantisse a un nombre fini de bits, les nombres qui ont une représentation binaire infinie sont tronqués. Cette troncature provoque des erreurs d'arrondi.

5.1 Le piège classique : 0,1 + 0,2

>>> 0.1 + 0.2
0.30000000000000004

>>> 0.1 + 0.2 == 0.3
False

Ce résultat surprenant n'est pas un bug de Python. C'est une conséquence directe du fait que ni 0,1, ni 0,2, ni 0,3 ne peuvent être représentés exactement en binaire. Les petites erreurs d'arrondi s'accumulent.

5.2 Autres exemples

>>> 0.1 + 0.1 + 0.1
0.30000000000000004

>>> 1/3
0.3333333333333333

>>> 1/3 + 1/3 + 1/3
1.0               # ici, Python compense l'erreur

>>> 0.1 * 3
0.30000000000000004

>>> 0.1 * 10
1.0000000000000002

5.3 Accumulation des erreurs

Les erreurs d'arrondi sont infimes pour un seul calcul, mais elles peuvent s'accumuler au fil de nombreuses opérations :

>>> somme = 0.0
>>> for i in range(1000):
...     somme += 0.001
>>> somme
0.9999999999999062    # au lieu de 1.0

Après 1 000 additions de 0,001, le résultat n'est pas exactement 1.


6. Règles à respecter avec les flottants

Règle n° 1 : ne jamais tester l'égalité de deux flottants

Ne jamais écrire :

if x == 0.3:    # MAUVAIS : risque de ne jamais être vrai

Utiliser plutôt une marge de tolérance (epsilon) :

if abs(x - 0.3) < 1e-9:    # BON : on accepte une petite marge d'erreur

Règle n° 2 : utiliser des entiers quand c'est possible

Pour manipuler des montants en euros, on travaille en centimes (entiers) plutôt qu'en euros (flottants).

# Mauvais : flottants
prix = 19.99
total = prix * 3    # 59.970000000000006

# Bon : entiers (centimes)
prix_centimes = 1999
total_centimes = prix_centimes * 3    # 5997, soit 59,97 euros

Règle n° 3 : attention aux comparaisons

Les opérateurs <, >, <=, >= fonctionnent généralement bien avec les flottants. C'est l'égalité stricte (==) qui est problématique.


7. Quels nombres sont représentés exactement ?

Un nombre décimal est représentable exactement en binaire si et seulement si il peut s'écrire sous la forme d'une fraction dont le dénominateur est une puissance de 2.

Nombre Fraction Dénominateur est une puissance de 2 ? Exact en binaire ?
0,5 1/2 Oui (2¹) ✅ Oui
0,25 1/4 Oui (2²) ✅ Oui
0,75 3/4 Oui (2²) ✅ Oui
0,125 1/8 Oui (2³) ✅ Oui
0,1 1/10 Non (10 = 2 × 5) ❌ Non
0,2 1/5 Non (5 n'est pas une puissance de 2) ❌ Non
0,3 3/10 Non ❌ Non
1/3 1/3 Non ❌ Non

8. Résumé

Concept Détail
Nombre flottant Représentation approximative d'un nombre réel sous la forme signe × mantisse × 2^exposant^
Erreurs d'arrondi 0,1 + 0,2 ≠ 0,3 en machine : conséquence de la représentation binaire finie
Exactitude Seules les fractions dont le dénominateur est une puissance de 2 sont exactes
Règle fondamentale Ne jamais tester l'égalité de deux flottants avec ==
Alternative Utiliser une marge de tolérance : abs(a - b) < epsilon
Bonne pratique Préférer les entiers quand c'est possible (centimes au lieu d'euros)