Flottants identiques comparant inégal

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