"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment atténuer les erreurs de virgule flottante en Python ?

Comment atténuer les erreurs de virgule flottante en Python ?

Publié le 2024-11-21
Parcourir:462

How to Mitigate Floating Point Errors in Python?

É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.
Déclaration de sortie Cet article est reproduit sur: 1729493718 S'il y a une contrefaçon, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

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