Puis-je ne pas fournir de condition d’égalité dans une boucle while?

J’ai écrit ce code et seul “Bonjour” a été imprimé.

float x=1.1; printf("Hello\n"); while(x-1.1==0) { printf("%f\n",x); x=x-1; } 

Lorsque vous traitez avec des opérations en virgule flottante, vous n’obtenez pas les résultats attendus.

Ce que vous voyez, c’est:

  1. 1.1 est représenté comme un float dans x .
  2. Dans l’instruction while , 1.1 est de type double , pas float . Par conséquent, x est promu en double avant la soustraction et la comparaison.

    Vous perdez de la précision dans ces étapes. Par conséquent, x-1.1 n’évalue pas à 0.0 .

Vous pouvez voir les résultats attendus si vous utilisez des constantes à virgule flottante appropriées.

 #include  void test1() { printf("In test1...\n"); float x=1.1; // Use a literal of type float, not double. if (x-1.1f == 0) { printf("true\n"); } else { printf("false\n"); } } void test2() { printf("In test1...\n"); // Use a variable of type double, not float. double x=1.1; if (x-1.1 == 0) { printf("true\n"); } else { printf("false\n"); } } int main() { test1(); test2(); return 0; } 

Sortie:

 In test1... true In test2... true 

En effet, x est un nombre à virgule flottante simple précision, mais vous en soustrayez la constante 1.1 , qui est double précision. Ainsi, votre simple précision 1.1 est convertie en double précision et la soustraction est effectuée, mais le résultat est non nul (puisque 1.1 ne peut pas être représenté exactement, mais la valeur à double précision est plus proche que la valeur à simple précision). Essayez ce qui suit:

 #include  int main() { float x = 1.1; double y = 1.1; printf("%.20g\n", x - 1.1); printf("%.20g\n", y - 1.1); return 0; } 

Sur mon ordinateur, le résultat est:

 2.384185782133840803e-08 0 

Comparez float comme -0.000001

Vous devez lire sur la précision en virgule flottante.

TL; DR est – x-1.1 n’est pas vraiment le tour 0.

Par exemple, dans mon débogueur, x est égal à 1.10000002 – cela est dû à la nature de la précision de la virgule flottante.

Lecture pertinente:

http://floating-point-gui.de/