duda conceptual C++

Joe Cabezas joe.cabezas en gmail.com
Lun Mayo 30 03:37:02 CLT 2011


excelente respuesta, no sabia que los numeros eran interpretados como double

cual es la diferencia con el static_cast?

finalmente lo resolvia asi:

	float mm = 0.4;
	float nn = 2.8;
	int xx = 3;

	float c1 = (mm * xx + nn);
	int c2 = c1;

	cout << "c1: " << c1 << endl;
	cout << "c2: " << c2 << endl;

lo que me sorprende es que en distintos sistema que se suponen ocupan el
mismo sistema o el mismo compilador den resultados distintos..., tu que
sabes, como explicas esto?

muchas gracias por el tiempo de atender mi duda, te lo agradezco un monton.

-Joe

El 30 de mayo de 2011 03:31, Felipe <kelt3we en gmail.com> escribió:

> 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