Je travaillais sur certaines questions “Déterminer la sortie” en C. J’ai découvert cette question qui semblait simple à première vue, mais après avoir exécuté le code, cela m’a laissé perplexe.
Le résultat attendu était “True”. Cependant, en courant, c’était “Faux”. Et quand j’ai vérifié la valeur de f en utilisant printf (), il montrait 0.1. Quelqu’un peut-il s’il vous plaît expliquer pourquoi f étant assigné 0.1 ne retourne pas vrai pour la déclaration si?
Il n’y avait aucune explication pour la réponse d’où j’avais ramassé la question, et je n’ai pas pu trouver de réponse moi-même.
#include int main() { float f = 0.1; if (f == 0.1) printf("True"); else printf("False"); }
Le problème est que la variable f
définie comme ayant le type float
alors que la constante float 0.1
a le type double
. Le type double
a plus de précision que le type float
. il a plus de chiffres binarys pour représenter la fraction. Donc, dans cette déclaration
float f = 0.1;
il y a une troncature.
Pour obtenir le résultat attendu, vous devez écrire au moins
if (f == 0.1f)
De plus, pour être sûr qu’il n’y ait pas d’arrondi, le code doit ressembler à
#include int main( void ) { float f = 0.1f; if ( f == 0.1f ) printf("True\n"); else printf("False\n"); }
C’est à cause de la précision de la valeur float.
Vérifiez ceci: – Ce que chaque informaticien devrait savoir sur l’arithmétique en virgule flottante
Vous pouvez mieux utiliser double au lieu de float.
Il faut également noter que ( correctement indiqué par WhozCraig ), 0.1 est un double et non un float. Changez le float
en double
et vous obtiendrez le résultat attendu.
0.1
ne peut pas être représenté exactement en binary. 0.1
en binary serait 0.0r0011r
ce qui est récurrent et arrondi de manière interne, ce qui n’est pas une valeur exacte. C’est pourquoi il retourne faux. Mais si vous essayez avec un nombre tel que 0.5 qui est 0.1
en binary ou 0.250 ou 0.125 selon ce qui peut être parfaitement représenté, il deviendra vrai. Lisez également http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html . Mieux vaut utiliser double
pour des résultats plus précis.
Eh bien, c’est un problème de type float. Vérifiez que si vous modifiez float avec un type double, il affiche true au lieu de false. Essayez aussi cette sortie:
#include int main() { float f; for(f=.0;f<10.;f+=0.1) printf("%f \n",f); }