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 <kelt...@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 >