Les notions et exercices de cette page peuvent être réservés
à une seconde lecture.
Vous pouvez consulter cette page
pour mieux saisir le problème de représentation des nombres flottants en machine.
Vous pouvez aussi compléter la lecture par
ce second article.
On a déjà signalé (en particulier dans l'exercice n°1 de la page précédente)
le fait que les nombres en machine ne sont pas les nombres mathématiques.
On retiendra entre autres :
- Les
float
, utilisés pour représenter les réels, ne constituent qu'une petite
partie des décimaux.
- Les inclusions mathématiques ne se retrouvent pas en machine : un entier est un réel mais
un
int
n'est pas un float
(toutefois, dans une opération faisant
intervenir int
et float
, en général les int
subissent une
conversion de type et sont alors "traités" comme float
).
- On peut observer facilement quelques comportements différents des nombres mathématiques.
Par exemple, la commutativité n'est pas garantie (du fait des calculs numériques
intermédiaires) :
Le test d'égalité « ==
» est bien adapté pour un test entre deux
entiers int
ou entre deux chaînes de caractères str
.
Mais, du fait de la représentation des nombres flottants en machine,
il est mal adapté à la comparaison de deux float
. Exécutez
le code ci-dessous pour vous en convaincre :
On rappelle que ce problème est incontournable, quel que
ce soit le langage de programmation. Il arrive que des choix de
programmation puissent masquer partiellement ce problème (dans les calculatrices
par exemple).
Une fonction Python pour tester l'égalité de deux float
Pour tester l'égalité de deux réels, on est donc contraint de tester en
fait la proximité des deux float
qui les représentent.
Tout cela au risque, évidemment, de conclure à l'égalité alors que les
réels représentés ne le sont pas. C'est un risque important et nous
connaissons déjà tous la difficulté qu'ont une majorité d'élèves à
l'appréhender (confusion classique entre un nombre et l'approximation
affichée par la machine, voire avec une approximation quelconque...).
Python offre une fonction
math.isclose()
pour tester cette proximité :
>>> from math import isclose
>>> a = 2 + 3.001
>>> b = 5.001
>>> isclose(a, b)
True
Cette fonction isclose()
peut être paramétrée pour accepter une plus ou
moins grande proximité (relative ou absolue) entre les float
.
Le règlage par défaut devrait convenir dans les situations pour la classe.
La
documentation
Python pour isclose()
.