Maison > développement back-end > C++ > Pourquoi l'arithmétique à virgule flottante en C entraîne-t-elle des problèmes de précision ?

Pourquoi l'arithmétique à virgule flottante en C entraîne-t-elle des problèmes de précision ?

DDD
Libérer: 2024-11-04 11:20:02
original
951 Les gens l'ont consulté

Why Does Floating-Point Arithmetic in C   Lead to Precision Issues?

Les bizarreries de la précision à virgule flottante en C

L'arithmétique à virgule flottante en C présente des comportements qui peuvent être contre-intuitifs. Considérez ce qui suit :

L'expression double a = 0,3 ; attribue une valeur qui représente logiquement 0,3 à la variable a. Cependant, la sortie de std::cout << un &Lt ;&Lt ; std::endl; avec 20 décimales de précision, indique "0,29999999999999999889". Cet écart suggère que le stockage interne du nombre à virgule flottante diffère de sa valeur logique.

De même, dans la boucle où a est ajouté à plusieurs reprises à b, le résultat à la fin de la boucle (50 itérations) est "15,000000000000014211", ce qui est plus élevé qu'il ne devrait l'être. Ce résultat démontre comment les erreurs d'arrondi peuvent s'accumuler au cours de plusieurs opérations.

Pour contourner ces problèmes de précision, il est important d'éviter de définir la précision des valeurs à virgule flottante supérieure à la précision réelle du type de données. Ceci peut être réalisé en utilisant l'approche suivante :

#include 
#include 

int main() {
    double a = 0.3;
    std::cout.precision(std::numeric_limits::digits10);
    std::cout << a << std::endl;

    double b = 0;
    for (char i = 1; i <= 50; i++) {
        b = b + a;
    }

    std::cout.precision(std::numeric_limits::digits10);
    std::cout << b << std::endl;
}

En définissant la précision sur la précision maximale disponible du type de données double, la sortie représentera avec précision les valeurs stockées. Cependant, si la boucle est exécutée sur un nombre d'itérations beaucoup plus grand (par exemple, 5 000 au lieu de 50), l'erreur accumulée deviendra toujours perceptible en raison des limitations inhérentes à 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.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal