Maison > développement back-end > C++ > Pourquoi ma comparaison en virgule flottante produit-elle des résultats inattendus ?

Pourquoi ma comparaison en virgule flottante produit-elle des résultats inattendus ?

Patricia Arquette
Libérer: 2024-12-25 02:20:09
original
313 Les gens l'ont consulté

Why Does My Floating-Point Comparison Produce Unexpected Results?

Écart de comparaison à virgule flottante

Dans l'extrait de code fourni :

int main()
{
    float a = 0.7;
    float b = 0.5;
    if (a < 0.7)
    {
       if (b < 0.5) printf("2 are right");
       else         printf("1 is right");
    }
    else printf("0 are right");
}
Copier après la connexion

la sortie attendue de "0 est droit" n'est pas obtenu. Au lieu de cela, « 1 est correct » est imprimé. Cet écart est dû à l'imprécision inhérente aux nombres à virgule flottante.

Lors de comparaisons avec des opérandes à virgule flottante, ils sont automatiquement promus à des valeurs en double précision. Les flotteurs, étant moins précis que les doubles, peuvent ne pas représenter exactement la valeur souhaitée. Dans ce cas, lorsque a (un float) est comparé à 0,7 (un double), a est converti en interne en double et perd en précision. Cela se traduit par un légèrement inférieur à 0,7, ce qui entraîne un < Comparaison 0,7 pour évaluer à vrai.

Pour résoudre ce problème, on peut soit :

  • Changer float en double :
double a = 0.7;
double b = 0.5;
Copier après la connexion
  • Utilisez des littéraux flottants avec un suffixe « f » :
float a = 0.7f;
float b = 0.5f;
Copier après la connexion

Les deux approches garantissent que les opérandes restent sous forme de flottants et évitent la perte de précision lors de la promotion au double.

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
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