Comprendre la comparaison de variables float dans if ()

Impossible de trouver la raison du code suivant:

#include  int main() { float f = 0.1; if (f == 0.1) printf("True"); else printf("False"); return 0; } 

La sortie est fausse.

 #include  int main() { float f = 0.1; if (f == (float)0.1) printf("True"); else printf("False"); return 0; } 

Affiche maintenant la sortie correcte. Quelle est la raison derrière cela?

Aussi quelle est la raison de ce comportement.

 #include  main() { int n = 0, m = 0; if (n > 0) if (m > 0) printf("True"); else printf("False"); } 

0.1 litre est double . Vous perdez la précision ici float f = 0.1;

Vous pourriez dire que nous perdons encore la précision lors de la comparaison, alors pourquoi f == 0.1 n’est-il pas vrai de toute façon? Parce que float s’étend jusqu’au double , pas l’inverse. En C, le type le plus petit s’étend toujours au plus grand.

En simplifiant votre exemple, nous pouvons dire que double(float(1.0)) != 1.0

Solutions possibles:

  • utilisez double au lieu de float comme type de f .
  • utilisez le casting comme dans votre 2ème exemple
  • utilisez les littéraux float – remplacez tous les 0.1 par 0.1f

Meilleure solution

Les variables à virgule flottante ont beaucoup de problèmes avec les comparaisons. Ils, y compris celui-ci, peuvent être résolus en définissant votre propre fonction de comparaison:

 bool fp_equal(double a, double b, double eps = FLT_EPSILON) { return fabs(a - b) < fabs(eps * a); } 

La deuxième partie de la question:

La raison pour laquelle la réponse est fausse est qu’autre else partie correspondant toujours au plus profond, if bloquée. Donc vous avez été dérouté par le formatage, le code est équivalent à:

 #include  int main() { int n = 0, m = 0; if (n > 0) { if (m > 0) { printf("True"); } else { printf("False"); } } } 

Répondez à votre deuxième question (troisième exemple):

Selon votre déclaration, le code ne fait pas ce que vous attendez:

 #include  main() { int n = 0, m = 0; if (n > 0) if (m > 0) printf("True"); else printf("False"); } 

Ici, le else appartient à l’intérieur if , donc c’est égal à

 #include  main() { int n = 0, m = 0; if (n > 0) { if (m > 0) { printf("True"); } else { printf("False"); } } } 

mais je pense que vous vouliez dire:

 #include  main() { int n = 0, m = 0; if (n > 0) { if (m > 0) { printf("True"); } } else { printf("False"); } } 

C’est un bon exemple de la raison pour laquelle on devrait toujours placer l’utilisateur entre crochets dans les déclarations if