[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