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