¿No puedo proporcionar una condición de igualdad en un bucle while?

Escribí este código y solo se imprimió ‘Hola’.

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

Cuando se trata de operaciones de punto flotante, no obtiene los resultados como esperaría.

Lo que estás viendo es:

  1. 1.1 se representa como un float en x .
  2. En la sentencia while , 1.1 es de tipo double , no float . Por lo tanto, x se promueve a un double antes de realizar la resta y la comparación.

    Pierdes precisión en estos pasos. Por lo tanto, x-1.1 no evalúa a 0.0 .

Puede ver los resultados esperados si usa las constantes de punto flotante apropiadas.

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

Salida:

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

Esto se debe a que x es un número de punto flotante de precisión simple, pero le resta la constante 1.1 , que es de precisión doble. Entonces su 1.1 precisión simple se convierte en precisión doble, y la resta se realiza, pero el resultado es distinto de cero (ya que 1.1 no se puede representar exactamente, pero el valor de precisión doble es más cercano que el valor de precisión simple). Intenta lo siguiente:

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

En mi computadora, el resultado es:

 2.384185782133840803e-08 0 

Compara el flotador como -0.000001

Necesitas leer sobre precisión de punto flotante.

TL; DR es – x-1.1 no es realmente redondo 0.

por ejemplo, en mi depurador, x es igual a 1.10000002, esto se debe a la naturaleza de la precisión del punto flotante.

Lectura relevante:

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