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 :
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!