duda conceptual C++
Felipe
kelt3we en gmail.com
Lun Mayo 30 03:31:12 CLT 2011
On 05/30/2011 03:02 AM, Joe Cabezas wrote:
> quisiera saber si alguien puede ayudarme con esto, tengo las siguientes
> lineas:
>
> float mm = 0.4;
> float nn = 2.8;
> int xx = 3;
>
> int c = (mm * xx + nn);
>
> cout << "c: " << c << endl;
>
>
> si hacéis la matemática: 0.4 * 3 + 2.8 = 4
> sin embargo el programa de arriba me imprime 3
>
> en qué me equivoqué?, que esta pasando?, porqué al truncar 4, da 3?
Pues hay varios detalles tips útiles aquí...
Tip #1) Literal float
Esto:
float mm = 0.4;
float nn = 2.8;
Esto deberías cambiarlo por:
float mm = 0.4f; /* nota el sufijo f aquí*/
float nn = 2.8f;
El literal f especifica que es un float y no un double.
Tip #2) Conversion implícita
Para facilitarle la vida al programador, C/C++ hacen conversiones
implícitas de algunos tipos. En este caso la presencia del int provoca
una conversión implicita a int que se traduce en un redondeo hacia abajo
(floor).
Lo que está ocurriendo es esto:
floor(floor(0.4f * 3) + 2.8f)
Si xx fuera un float, o fuera casteado a float en la operación esto no
pasaría.
Algo así: int c = (mm * (float) xx + nn);
Ahora, la forma correcta en C++ de hacer este cast es con
static_cast<float>(xx) no (float) xx.
Finalmente...
Para comprobar que no te estoy muleando, haz la prueba con el siguiente
código:
std::cout << int(0.4f * 1 + 2.8f) << std::endl;
std::cout << int(0.4f * 3.0f + 2.8f) << std::endl;
La primera linea imprimirá 3, la segunda 4.
Espero que te sirva
Saludos,
Felipe
Más información sobre la lista de distribución Linux