Éviter les erreurs à virgule flottante en Python
Dans le domaine de la programmation, il est essentiel de comprendre les subtilités des calculs à virgule flottante, car ils peuvent introduire des erreurs inattendues s’il n’est pas géré correctement. Cet article explore un exemple pratique qui met en évidence les pièges de l'arithmétique à virgule flottante.
Le problème de la racine carrée
Considérez une fonction Python conçue pour approximer les racines carrées :
def sqrt(num):
root = 0.0
while root * root En utilisant cette fonction, nous rencontrons des résultats surprenants :
>>> sqrt(4)
2.0000000000000013
>>> sqrt(9)
3.00999999999998
L'arithmétique à virgule flottante explique ces inexactitudes. Lorsqu'ils représentent des nombres fractionnaires, les ordinateurs les stockent sous la forme d'une combinaison d'entiers et d'exposants. En raison des limitations de cette représentation, certaines valeurs décimales ne peuvent pas être représentées exactement, ce qui conduit à des approximations.
Comprendre l'erreur
Dans le code ci-dessus, le problème réside dans le incrément utilisé pour augmenter la valeur racine. Bien que nous ayons l'intention d'ajouter une valeur de 0,01, la valeur réelle stockée dans le registre à virgule flottante est légèrement différente et supérieure à 0,01.
Résoudre l'erreur
Pour éviter erreurs à virgule flottante, diverses approches peuvent être utilisées :
- Utilisation du module décimal :
Le module décimal Le module en Python fournit une arithmétique décimale plus précise. En remplaçant float par Decimal dans le code, nous obtenons des résultats plus précis :
from decimal import Decimal as D
def sqrt(num):
root = D(0)
while root * root
Now, the function returns precise results, such as:
```
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
```
- Utilisation d'incréments à virgule non flottants :
Si l'utilisation du module Decimal n'est pas une option, une autre approche consiste à utiliser des valeurs à virgule flottante qui sont exactement représentables en binaire, tel que 1/2**J. Cela implique un code plus complexe, mais cela garantit des incréments précis. - Utilisation de techniques d'analyse numérique :
L'analyse numérique offre des méthodes spécialisées pour gérer des calculs mathématiques complexes. Des techniques telles que la méthode de Newton peuvent fournir des approximations précises de la racine carrée.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3