Maison >développement back-end >Tutoriel Python >Comment atténuer les erreurs de virgule flottante en Python ?

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

Susan Sarandon
Susan Sarandonoriginal
2024-10-21 15:08:30936parcourir

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érons une fonction Python conçue pour approximer les racines carrées :

<code class="python">def sqrt(num):
    root = 0.0
    while root * root < num:
        root += 0.01
    return root

En utilisant cette fonction, nous rencontrons des résultats surprenants :

>>> sqrt(4)
2.0000000000000013
>>> sqrt(9)
3.00999999999998</code>

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 en virgule flottante, diverses approches peuvent être utilisées :

  • Utilisation du module décimal :
    Le module Decimal 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 :
<code class="python">from decimal import Decimal as D

def sqrt(num):
    root = D(0)
    while root * root < num:
        root += D("0.01")
    return root
Now, the function returns precise results, such as:

```
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
```
</code>
  • Utilisation d'incréments à virgule non flottante :
    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, telles 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.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn