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
Libérer: 2024-12-19 04:18:09
original
494 Les gens l'ont consulté

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");
}
Copier après la connexion

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!

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