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

Pourquoi la comparaison à virgule flottante en C produit-elle parfois des résultats inattendus ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-17 01:21:25375parcourir

Why Does Floating-Point Comparison in C Sometimes Produce Unexpected Results?

Anomalies de comparaison à virgule flottante

Le concept de comparaisons à virgule flottante peut être trompeur, en particulier lorsqu'il s'agit de types de données flottants. Prenons l'exemple suivant :

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");
}

Intuitivement, on pourrait supposer que ce code afficherait "0 ont raison" puisque la condition initiale est fausse. Cependant, étonnamment, le résultat réel est "1 est correct".

Explication

L'explication réside dans la représentation interne des nombres à virgule flottante. En C, les flottants sont promus en doubles lors des comparaisons, et les doubles sont plus précis que les flottants. Par conséquent, 0,7 en flottant n’est pas exactement la même chose que 0,7 en double. Lorsque 0,7 (en flottant) est promu en double, il devient légèrement inférieur à 0,7 (en double).

D'autre part, 0,5 (en flottant) se trouve être une représentation exacte en double. précision. Par conséquent, lorsque la condition b < 0,5 est évalué, il renvoie faux car 0,5 (en double) n'est pas inférieur à lui-même.

Solutions

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

  1. Changer float en double : En déclarant a et b comme doubles, vous vous assurez que ils ne sont pas promus lors de la comparaison, et le comportement attendu sera obtenu.
  2. Ajouter le suffixe f aux littéraux : En ajoutant le suffixe f aux littéraux, vous indiquez explicitement qu'ils doivent être traités comme des flotteurs. Cela empêchera la promotion de doubler lors de la comparaison.

En mettant en œuvre l'une ou l'autre de ces solutions, vous pouvez obtenir le résultat souhaité 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