Ver Mensaje Individual
  #4 (permalink)  
Antiguo 01/04/2012, 14:14
Fw190
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: Validacion doble

El código está bien. El tema está en las comparaciones cuando hablamos de tipos en coma flotante, que es asunto de la máquina o del compilador, y pòco puedes hacer desde fuera.

Prueba incluyendo el archivo <math.h>, ahí puede que haya alguna definición o se active alguna cosa para el compilador que pueda ayudarte (aunque, francamente, lo dudo).

Prueba esta porción de código (el mismo que posteaste, pero simplificado), así puedes hacerte idea de lo que está pasando.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main (void)
  5. {
  6.     double  LIQST[11],c;
  7.     double  eps = 1.0e-8;
  8.     int     i,j,k;
  9.     char    comp[11][15]={"CO2","H2S","C1","C2","C3","iC4","nC4","iC5","nC 5","C6","C7+"};
  10.  
  11.     do
  12.     {
  13.         printf("DATOS DEL STOK TANK\nComposicion liquido:\n");
  14.         c = 0.0;
  15.         for(i=0; i<=10; i++)
  16.         {
  17.             printf("(%d) %s : ", (i+1), comp[i]);
  18.             scanf("%lf", &LIQST[i]);
  19.             c += LIQST[i];
  20.             printf("%24.20f  ***  %24.20f\n", LIQST[i], c);
  21.         }
  22.     }
  23.     while (fabs(c - 1.0) > eps);
  24.     system("pause");
  25. }

(está en C y no C++, no controlo C++). El formato de printf es para que muestre 20 cifras decimales.

El valor eps lo he establecido arbitrariamente para la comparación, si quieres seguir con la doble validación utiliza este sistema, prueba distintos valores. Dependerá de la precisión que necesites.

En cualquier caso, procura evitar las comparaciones de igualdad entre valores en coma flotante.

Si quieres probar también con tipos float, cambia el especificador de formato de scanf de %lf (double, 64 bits) a %f (float, 32 bits). Así podrás ver dónde empiezan a cambiar las cifras decimales.

El Análisis Numérico no es solamente resolver problemas matemáticos mediante un ordenador. Una de sus partes es, precisamente, minimizar los errores por redondeo. Fíjate en el que se te ha presentado con algo tan sencillo como una comprobación de unos pocos datos introducidos por teclado.

Saludos,