É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"); }
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 :
double a = 0.7; double b = 0.5;
float a = 0.7f; float b = 0.5f;
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!