Maison >développement back-end >C++ >Pourquoi les comparaisons à virgule flottante sont-elles inexactes et comment puis-je garantir des résultats corrects ?

Pourquoi les comparaisons à virgule flottante sont-elles inexactes et comment puis-je garantir des résultats corrects ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-19 17:26:101013parcourir

Why Are Floating-Point Comparisons Inaccurate, and How Can I Ensure Correct Results?

Confusion de comparaison à virgule flottante

Dans l'extrait de code donné, les vérifications de comparaison entre les nombres à virgule flottante ne sont pas aussi simples qu'on pourrait s'y attendre . Lorsqu'il s'agit de comparaisons à virgule flottante, il est important de comprendre la représentation en virgule flottante et les pièges potentiels qui en découlent.

Les pièges de la virgule flottante

Le problème avec le code réside dans la comparaison de nombres à virgule flottante. Les nombres à virgule flottante sont stockés dans un format binaire qui utilise un nombre fini de bits pour représenter à la fois la grandeur et l'exposant. Cela signifie qu'il existe des limites inhérentes à la précision avec laquelle les nombres à virgule flottante peuvent représenter certaines valeurs, entraînant des erreurs d'arrondi.

Dans le code fourni, les variables a et b sont toutes deux définies comme des flottants. Lors de la comparaison de a à 0,7, le compilateur promeut le float en double pour la comparaison. Ce type de promotion peut entraîner une perte de précision, car la double représentation de a peut ne pas être exactement égale à 0,7. De plus, 0,5 est une puissance exacte de 2, qui peut être représentée précisément au format à virgule flottante.

En conséquence, la comparaison a < 0,7 sera évalué comme vrai en raison de la promotion de a en double et de la représentation imprécise de 0,7. Cela explique la sortie inattendue de « 1 c'est vrai » au lieu du « 0 c'est vrai » attendu.

Assurer des comparaisons correctes

Pour éviter de tels problèmes, il existe deux approches possibles :

  • Utiliser des doubles au lieu de flottants : En définissant a et b comme des doubles (double a = 0,7 ; double b = 0,5 ;), vous pouvez vous assurer que les comparaisons sont effectuées avec toute la précision des doubles, réduisant ainsi le risque d'erreurs d'arrondi.
  • Utilisez des suffixes à virgule flottante : Alternativement , vous pouvez ajouter des suffixes f aux littéraux à virgule flottante pour forcer le compilateur à les traiter comme des flottants lors de la comparaison. Cette approche vous permet de conserver le type float tout en garantissant la précision correcte : if (a < 0.7f).

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