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

Susan Sarandon
Libérer: 2024-10-21 15:08:30
original
827 Les gens l'ont consulté

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
Copier après la connexion

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

>>> sqrt(4)
2.0000000000000013
>>> sqrt(9)
3.00999999999998</code>
Copier après la connexion

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
Copier après la connexion
Now, the function returns precise results, such as:

```
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
```
</code>
Copier après la connexion
  • 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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!