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!