Python en mathématiques - Niveau 1

Nombres en machine

Plus tard ! 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.

Les nombres en machine ne sont pas les nombres mathématiques

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

Égalité de deux float

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().