Dev - C++ - La condición en un While no se comprueba bien

 
Vista:

La condición en un While no se comprueba bien

Publicado por José Luis (4 intervenciones) el 05/08/2015 00:47:12
Si la variable pago es igual a 0.65 no sale del While, cuando la condición es "menor que", y debería salir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
  float pago;
 
  printf("Introduzca las monedas\n\n");
  pago = 0.0;
 
  while(pago < 0.65)
  {
    printf("pago = ");
    scanf("%f", &pago);
  }
  printf("la cantidad introducida fue de %f\n", pago);
 
  return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

La condición en un While no se comprueba bien

Publicado por vangodp (287 intervenciones) el 05/08/2015 02:56:13
te explicas fatal pero eh entendido o eso creo que quieres salir cuando pago sea menor que 0.65. Si es eso prueba:
while( ( !(pago < 0.65) )...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

La condición en un While no se comprueba bien

Publicado por José Luis (4 intervenciones) el 05/08/2015 10:58:23
Jejeje. Si, parece que la expresión escrita no es una de mis muchas virtudes.
Verás, tengo ese programita en C que lo que debería hacer es pedir un número (real) al usuario. Mientras el número sea menor que 0.65 debería seguir pidiendo otro número (pues los números menores que 0.65 no me sirven). Una vez que el número introducido es mayor o igual que 0.65 debería salirse del bucle while.
El caso es que cuando el número introducido es precisamente 0.65 (es decir, se da la igualdad) se sigue ejecutando el while, por algún extraño fenómeno la condición del while (menor estricto) acepta la igualdad como valor verdadero de (pago < 0.65), lo cual evidentemente no debería suceder.
Tu solución (de usar el NOT) tampoco me funcionó (usé (!(pago >= 0.65)) y sigue dando el mismo problema cuando el dato introducido es 0.65.
No tengo ni idea de lo que puede estar fallando, me huele a que puede estar relacionado con el tipo float y su precisión, de hecho si cambias el tipo de la variable pago a long float si funciona. Pero debería funcionar con float, solo uso números con dos decimales y para eso debería sobrar la precisión de un float.

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

La condición en un While no se comprueba bien (RESUELTO)

Publicado por José Luis (4 intervenciones) el 07/08/2015 16:22:04
Asunto arreglado.

El problema reside en la forma que se almacenan las variables de tipo Float y su precisión. Cuando se escribe 0.65 en el bucle While este valor se toma como de tipo Double (no Float), y al comparar la variable pago (que almacena el valor 0.65 en float) con el 0.65 literal (que en realidad es un double) resulta que el float es "menor", por eso el bucle While se sigue ejecutando.

Solución: declarar la variable pago como Double, y hacer scanf("%lf", pago) (nótese el format lf)

Otra solución: sustituir el 0.65 en el While con 0.65F (es decir, convertir 0.65 a float en lugar de double)

Espero que esto pueda ayudar a otros que tengan problemas de precisión con el tipo float.

Una buena guía al tema está aquí: https://es.wikipedia.org/wiki/IEEE_coma_flotante
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar