[C con Clase] casting reenviado

Salvador Pozo salvador en conclase.net
Mie Mayo 16 17:46:30 CEST 2007


El pasado 2007-05-10 02:01:40, rodolfo escribió:
 
r> Hola, creo que mi anterior correo no salio,  gracias a Steven y a Pedro por 
r> lo de las precedencias, asunto aclarado.
r> Tengo una duda respecto al casting:
r> Cuando corro este programa
r>     double arregloDobles[] = {1.1, 2.2, 3.3, 4.4, 5.5};
r>     cout << setprecision(2)<< fixed;
r>     cout << " Valor Resta Doble Entero" << endl;
r>     for (int i = 0; i<5 ; i++)
r>     {
r>         int resta = i+1;
r>         cout << setw(6) << arregloDobles[i] << setw(6) << resta;
r>         double doble = (arregloDobles[i]-resta)*10;
r>         cout << setw(6) << doble;
r>         int entero = static_cast<int>(doble);
r>         cout << setw(7) << entero << endl;
r>      }
r> El resultado es el siguiente:
r>     Valor Resta Doble Entero
r>       1.1     1   1.0      1
r>       2.2     2   2.0      2
r>       3.3     3   3.0      2  ------> ¿ que paso aqui ?
r>       4.4     4   4.0      4
r>       5.5     5   5.0      5
r> pregunta: ¿porque en la tercera linea el valor entero sale 2 en vez de 3 
r> como se esperaba ?
r> lo he compilado con dev-cpp y con visual c++ 6.0 y el resultado es el mismo, 
r> ¿ alquien tiene idea de que es lo que estoy haciendo mal ?

Hola:

Me parece que este mensaje se ha quedado sin responder.

El aparente funcionamiento erroneo de este programa se debe a dos causas:

1) Las variables 'double' a pesar de tener gran precisión, no son precisas. Al hacer operaciones con ellas siempre se puede perder algún decimal. Eso es lo que pasa al hacer restas y multiplicaciones cuando calculas el valor de doble.

2) Has limitado la precisión que muestra el compilador al imprimir el valor de las variables a dos decimales. Esto sólo limita el aspecto de la salida, pero no influye en la precisión interna de las variables.

La pérdida de la precisión en el caso de la tercera línea se produce a partir del decimal 15. Esto queda oculto por la precisión usada para mostrar el valor, pero no para el casting, que sencillamente se queda con la parte entera de la variable.

Si cambias la línea en la que limitas la precisión a dos decimales por otra que la limite a 15, la salida es:

 Valor Resta Doble Entero
1.100000000000000     11.000000000000001      1  1.000000000000001
2.200000000000000     22.000000000000002      2  2.000000000000002
3.300000000000000     32.999999999999998      2  2.999999999999998
4.400000000000000     44.000000000000004      4  4.000000000000004
5.500000000000000     55.000000000000000      5  5.000000000000000

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase