Maison >développement back-end >C++ >Pourquoi la comparaison des flotteurs en C produit-elle parfois des résultats inattendus ?

Pourquoi la comparaison des flotteurs en C produit-elle parfois des résultats inattendus ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-19 04:18:09510parcourir

Why Does Comparing Floats in C   Sometimes Produce Unexpected Results?

Comprendre la comparaison à virgule flottante en C

Lors de la comparaison de valeurs à virgule flottante en C, il est important d'être conscient des inexactitudes potentielles dues à leur précision limitée. Dans l'extrait de code fourni, la sortie inattendue « 1 est correct » est observée lors de la comparaison des flottants a et b avec les constantes 0,7 et 0,5, respectivement.

Causes de la sortie inattendue :

Le problème se pose pour les raisons suivantes :

  • Implicite Conversion de type : Lors de la comparaison d'un float à un double (par exemple, if (a < 0,7)) ou d'un float à une constante littérale qui est un double (par exemple, if (a < .7)), le float est implicitement converti en double.
  • Précision limitée des flotteurs : Les flotteurs ont une précision inférieure à celle des doubles, ce qui signifie qu'ils peuvent représenter avec précision moins de décimales. Par conséquent, 0,7 en tant que flottant peut ne pas être exactement la même chose que 0,7 en tant que double.
  • Représentation exacte des constantes : Les constantes comme 0,5 qui sont des puissances de 2 peuvent être représentées exactement comme flotte et double. Par conséquent, b < 0,5 reste faux même lorsque b est un float légèrement inexact.

Résolution :

Pour obtenir le résultat attendu, vous pouvez soit :

  • Utiliser les doubles : Changez les variables a et b en doubles (double a = 0,7 ; double b = 0.5;).
  • Utiliser les littéraux flottants : Modifiez les constantes en littéraux flottants (if (a < 0.7f) et if (b < 0.5f)). Cela force la comparaison à utiliser des flottants partout.

Code avec résultat attendu :

int main()
{
    double a = 0.7;
    double 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");
}

Dans ce code corrigé, la comparaison de a et b à leurs doubles respectifs garantissent une précision précise, ce qui donne le résultat attendu de « 0 a raison ».

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