Comment pouvons-nous gérer et résoudre les erreurs à virgule flottante ?

Linda Hamilton
Libérer: 2024-10-21 14:57:03
original
543 Les gens l'ont consulté

How Can We Handle and Resolve Floating-Point Errors?

Comprendre les erreurs à virgule flottante et leur résolution

L'arithmétique à virgule flottante pose des défis uniques en raison de sa nature approximative. Pour traiter efficacement ces erreurs, nous devons examiner leur cause profonde.

En Python, les calculs à virgule flottante utilisent la représentation binaire, ce qui entraîne des inexactitudes. Comme le démontre l'extrait de code, les tentatives d'approximation des racines carrées sont légèrement erronées en raison de cette approximation. Par exemple :

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

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

Pour mieux comprendre ces erreurs, considérons la représentation décimale exacte de 0,01 à l'aide du module décimal :

<code class="python">from decimal import Decimal
print(Decimal(.01)) # Output: Decimal('0.01000000000000000020816681711721685132943093776702880859375')</code>
Copier après la connexion

Cette chaîne révèle que la valeur réelle ajoutée est légèrement supérieur à 1/100. Par conséquent, la représentation en virgule flottante des valeurs décimales introduit ces variations mineures.

Pour atténuer ces erreurs, plusieurs approches existent :

  1. Module décimal : Utiliser le Le module décimal garantit que les opérations sont effectuées avec précision, éliminant ainsi les erreurs d'arrondi. Dans la fonction modifiée ci-dessous, nous utilisons cette approche :
<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

print(sqrt(4)) # Output: Decimal('2.00')
print(sqrt(9)) # Output: Decimal('3.00')</code>
Copier après la connexion
  1. Incréments contrôlables : Au lieu d'ajouter directement 0,01, il est conseillé d'ajouter des valeurs exactement représentables sous forme de flottants binaires, tels que I/2**J. En utilisant 0,125 (1/8) ou 0,0625 (1/16) comme incréments, cela élimine les erreurs d'approximation.

En combinant ces méthodes et en tirant parti de techniques telles que la méthode de Newton, vous pouvez obtenir des valeurs flottantes très précises. calculs de points, élargissant votre compréhension de l'analyse numérique et gérant efficacement l'arithmétique à virgule flottante.

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!