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:
double
au lieu de float
comme type de f
. 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