Gérer la précision des nombres à virgule flottante
Dans cette étape, nous allons discuter de la manière de gérer la précision des nombres à virgule flottante lors de la comparaison de ces nombres avec zéro. En raison de la manière dont les nombres à virgule flottante sont représentés dans les ordinateurs, ils sont souvent sujets à de petites erreurs d'arrondi. Cela peut entraîner des résultats inattendus lors de leur comparaison directe avec zéro.
Par exemple, un calcul qui devrait théoriquement donner zéro peut en réalité produire un très petit nombre non nul comme 1e-16
(0,0000000000000001). Comparer directement ce nombre avec zéro en utilisant ==
renverra False
, ce qui peut ne pas être le résultat souhaité.
Pour gérer ce problème, nous utilisons généralement une valeur de tolérance (également appelée epsilon) pour vérifier si un nombre à virgule flottante est « suffisamment proche » de zéro.
Créons un script Python pour démontrer cela.
-
Ouvrez l'éditeur VS Code dans l'environnement LabEx.
-
Créez un nouveau fichier nommé float_precision.py
dans le répertoire ~/project
.
~/project/float_precision.py
-
Ajoutez le code suivant à float_precision.py
:
## Import the math module
import math
## Define a tolerance value (epsilon)
tolerance = 1e-9 ## A small value like 0.000000001
## A floating-point number that is very close to zero due to calculation
number = 1e-10
## Direct comparison with zero (may fail)
if number == 0:
print("Direct comparison: number is zero")
else:
print("Direct comparison: number is not zero")
## Using tolerance to compare with zero
if math.isclose(number, 0, abs_tol=tolerance):
print("Comparison with tolerance: number is close to zero")
else:
print("Comparison with tolerance: number is not close to zero")
## Another example with a slightly larger number
number = 1e-7
## Direct comparison with zero (will fail)
if number == 0:
print("Direct comparison: number is zero")
else:
print("Direct comparison: number is not zero")
## Using tolerance to compare with zero
if math.isclose(number, 0, abs_tol=tolerance):
print("Comparison with tolerance: number is close to zero")
else:
print("Comparison with tolerance: number is not close to zero")
Ce script démontre comment utiliser la fonction math.isclose()
avec une valeur de tolérance pour comparer des nombres à virgule flottante avec zéro.
-
Enregistrez le fichier.
-
Exécutez le script en utilisant la commande python
dans le terminal :
python float_precision.py
Vous devriez voir la sortie suivante :
Direct comparison: number is not zero
Comparison with tolerance: number is close to zero
Direct comparison: number is not zero
Comparison with tolerance: number is not close to zero
Comme vous pouvez le voir, la comparaison directe échoue car le nombre n'est pas exactement zéro. Cependant, lorsque vous utilisez une valeur de tolérance avec math.isclose()
, la comparaison identifie correctement que le nombre est proche de zéro.
La fonction math.isclose()
vérifie si deux valeurs à virgule flottante sont proches l'une de l'autre dans une tolérance spécifiée. L'argument abs_tol
spécifie la tolérance absolue. Si la différence absolue entre les deux nombres est inférieure ou égale à la tolérance, la fonction renvoie True
.
En utilisant une valeur de tolérance, vous pouvez éviter les problèmes causés par la précision des nombres à virgule flottante et vous assurer que vos comparaisons avec zéro sont précises et fiables.