duda conceptual C++
hola comunidad! tengo la siguiente duda sobre c++, entiendo que tal vez no es un problema relacionado directamente con linux, lo unico que tiene relacion es que para compilar ocupo g++ 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? le he comentado a un amigo (que usa ArchLinux) este problema, pero segun él, su compilador (g++ tambien), el ejecutable imprime 4, las especificaciones del sistema de él son: [mario@ArchLinux Desktop]$ uname -a Linux ArchLinux 2.6.37-ARCH #1 SMP PREEMPT Fri Mar 25 15:10:00 CET 2011 x86_64 Pentium(R) Dual-Core CPU T4400 @ 2.20GHz GenuineIntel GNU/Linux [mario@ArchLinux Desktop]$ g++ --version g++ (GCC) 4.5.2 20110127 (prerelease) Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. al parecer el compilador imprime cosas distintas segun el sistema, mi sistema es un Ubuntu 11.04 y la version de g++: joe@joe-laptop:~/Escritorio$ uname -a Linux joe-laptop 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux joe@joe-laptop:~/Escritorio$ g++ --version g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. joe@joe-laptop:~/Escritorio$ man g++ | grep 2011 gcc-4.5.2 2011-04-18GCC(1) que puedo hacer para que me imprima el resultado correcto?, podeis darme una pista de que hice mal?, gracias! -Joe
Re: duda conceptual C++
2011/5/30 Joe Cabezas > 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 > > Esto se produce por las operaciones de punto flotante. Probé en Linux x86 y OS X y obtuve 4, sin embargo en un Linux virtualizado sobre amd64 obtuve 3. Si convierto c a float, obtengo 4. Suerte. -- Atte, Juan Cristóbal Olivares *La disposición a admirar, casi a adorar, a los ricos y poderosos y a descuidar a las personas más pobres … es la mayor y más universal causa de corrupción de nuestros sentimientos morales (**Adam Smith)*
Re: duda conceptual C++
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(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
Re: duda conceptual C++
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 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(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 >
Re: duda conceptual C++
> 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. haha todo mal (nótese el 1 en la primera línea). Eso pasa por responder a las 3:39 AM.
Re: duda conceptual C++
claramente son distintos, uno da 3.2 XD estimado, yo estoy aprendiendo c++, y veo que ocupas std::cout, porque motivo no usas el namespace?, estoy interesado en aprender buenas practicas en c++, algun libroq ue recomiendes? sigo con la duda de que porque funciona distinto en cada pc El 30 de mayo de 2011 03:40, Felipe escribió: > > 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. > > haha todo mal (nótese el 1 en la primera línea). Eso pasa por responder > a las 3:39 AM. > >
Re: duda conceptual C++
On 05/30/2011 03:37 AM, Joe Cabezas wrote: > 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 Hay muchas cosas que mencioné que estaban mal y le debo haber alegrado el día a mas de algún listero: - En la parte final el código había un 1 en lugar de un 3 haciendo que todo el ejemplo esté mal, epic fail. - En la sección sobre las conversiones implícitas en operaciones aritméticas, funciona distinto (promoción de tipos): antes de realizarse la operación, si los tipos son distintos, el tipo de menor precisión se convierte al de mayor precisión. Adicionalmente pueden haber más conversiones implícitas, por ejemplo, antes de almacenar el resultado en una variable de tipo distinto. g++ tiene muchas versiones, muchos flags (distintos optimizaciones, distintos sets de instrucciones, etc.), está en muchas arquitecturas y en resumen hay muchas combinaciones posibles que se pueden dar. Habría que ver que flags se usaron, que versión fue y en qué arquitectura pasó. Y tambien existen casos extremos como el mítico bug FDIV de las FPU de los procesadores Pentium que hacía que las divisiones de punto flotante dieran resultados erróneos. Sobre el operador static_cast: Hay varios operadores de conversión de tipos en C++: static_cast, dynamic_cast, reinterpret_cast, const_cast. Este post lo explica en horrendo detalle: http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be-used/332080#332080 Saludos, Felipe
Re: duda conceptual C++
On 05/30/2011 03:47 AM, Joe Cabezas wrote: > claramente son distintos, uno da 3.2 XD > > estimado, yo estoy aprendiendo c++, y veo que ocupas std::cout, porque > motivo no usas el namespace?, estoy interesado en aprender buenas practicas > en c++, algun libroq ue recomiendes? > "Accelerated C++" por Andrew Koenig y Barbara Moo "Effective C++" y "More Effective C++" por Scott Meyers "The C++ Programming Language" por el tío Bjarne Stroustrup ...Todos disponibles en Amazon. El primero no es caro, es bastante leible, es el más recomendado para comenzar a aprender C++ y cuenta con la bendición de Bjarne Stroustrup, autor original de C++. Sobre buenas prácticas en C++: la regla más importante es que hagas lo que hagas, intenta ser consistente y "no abusar del lenguaje". Ahora si quieres un ejemplo extremo: este es un standard de codificación creado por Lockheed Martin para implementar todo el software para el F-35 Lightning II, lejos el standard más estricto que he leido, pero bastante bien fundamentado. Si sigues todas las reglas que aparecen ahí serás el nuevo führer: http://www.jsf.mil/downloads/documents/JSF_AV_C++_Coding_Standards_Rev_C.doc Algunas recomendaciones que no vas a encontrar ahí: * Antes de implementar algun algoritmo revisa los que vienen con STL (documentados en horrendo detalle en http://www.cplusplus.com/reference/algorithm/) * Intenta usar referencias de C++ en lugar de punteros cuando sea posible. Es el "C++ way". * Usa plantillas (templates) cuando sea estrictamente necesario. * Intenta usar const cuando corresponde (const correctness). http://www.parashift.com/c++-faq-lite/const-correctness.html * Infórmate sobre el próximo standard, C++0x. Cambiará todas las reglas del juego y algunas caracteristicas ya están disponibles en g++: http://www2.research.att.com/~bs/C++0xFAQ.html * Evita usar MS Visual C++ y su "biblioteca standard" (es reible lo standard que es) Saludos, Felipe
Re: duda conceptual C++
El día 30 de mayo de 2011 05:42, Felipe escribió: > On 05/30/2011 03:47 AM, Joe Cabezas wrote: >> claramente son distintos, uno da 3.2 XD >> >> estimado, yo estoy aprendiendo c++, y veo que ocupas std::cout, porque >> motivo no usas el namespace?, estoy interesado en aprender buenas practicas >> en c++, algun libroq ue recomiendes? >> > > "Accelerated C++" por Andrew Koenig y Barbara Moo > "Effective C++" y "More Effective C++" por Scott Meyers > "The C++ Programming Language" por el tío Bjarne Stroustrup > > ...Todos disponibles en Amazon. El primero no es caro, es bastante > leible, es el más recomendado para comenzar a aprender C++ y cuenta con > la bendición de Bjarne Stroustrup, autor original de C++. > > > Sobre buenas prácticas en C++: la regla más importante es que hagas lo > que hagas, intenta ser consistente y "no abusar del lenguaje". > > Ahora si quieres un ejemplo extremo: este es un standard de codificación > creado por Lockheed Martin para implementar todo el software para el > F-35 Lightning II, lejos el standard más estricto que he leido, pero > bastante bien fundamentado. Si sigues todas las reglas que aparecen ahí > serás el nuevo führer: > http://www.jsf.mil/downloads/documents/JSF_AV_C++_Coding_Standards_Rev_C.doc > > Algunas recomendaciones que no vas a encontrar ahí: > * Antes de implementar algun algoritmo revisa los que vienen con STL > (documentados en horrendo detalle en > http://www.cplusplus.com/reference/algorithm/) > * Intenta usar referencias de C++ en lugar de punteros cuando sea > posible. Es el "C++ way". > * Usa plantillas (templates) cuando sea estrictamente necesario. > * Intenta usar const cuando corresponde (const correctness). > http://www.parashift.com/c++-faq-lite/const-correctness.html > * Infórmate sobre el próximo standard, C++0x. Cambiará todas las reglas > del juego y algunas caracteristicas ya están disponibles en g++: > http://www2.research.att.com/~bs/C++0xFAQ.html > * Evita usar MS Visual C++ y su "biblioteca standard" (es reible lo > standard que es) > > Saludos, > Felipe > Marcado y tirado a mi carpeta de correos importantes, buen aporte con respecto a las lecturas recomendadas. Se agradece felipe. Saludos Cordiales. -- Roberto Quiñones Owner - Service Manager and System ACShell.NET – Internet Services robe...@acshell.net - www.acshell.net San Martin #311 Santiago – CL (Chile) +560981361713
KVM
Estimados: He estado leyendo el tema de KVM, y al parecer es una buena forma de virtualizar. Mi drama es el siguiente, tengo una máquina en linux y la quiero virtualizar, pensaba realizarlo con VMware(esxi), pero la tarjeta de red no está soportada, y dentro de la lista de tarjetas de red, es muy dificil conseguir una. Entonces pensaba en la opción de virtualizar con linux(centos,debian,ubuntu, da igual)+kvm. Me gustaría saber si alguien lo ha implementado, y le funciona con éxito. Gracias.
Re: KVM
Kvm funciona impecable. Describe mejor tu hw. Y proposito Juan Andres Ramirez wrote: >Estimados: > He estado leyendo el tema de KVM, y al parecer es una buena >forma de virtualizar. Mi drama es el siguiente, tengo una máquina en >linux y la quiero virtualizar, pensaba realizarlo con VMware(esxi), >pero la tarjeta de red no está soportada, y dentro de la lista de >tarjetas de red, es muy dificil conseguir una. Entonces pensaba en la >opción de virtualizar con linux(centos,debian,ubuntu, da igual)+kvm. >Me gustaría saber si alguien lo ha implementado, y le funciona con >éxito. > >Gracias.
Re: KVM
Pero KVM no seria el simil de Windows con Hyper-V? El 30 de mayo de 2011 17:43, Larry Letelier escribió: > Kvm funciona impecable. Describe mejor tu hw. Y proposito > > Juan Andres Ramirez wrote: > > >Estimados: > > He estado leyendo el tema de KVM, y al parecer es una buena > >forma de virtualizar. Mi drama es el siguiente, tengo una máquina en > >linux y la quiero virtualizar, pensaba realizarlo con VMware(esxi), > >pero la tarjeta de red no está soportada, y dentro de la lista de > >tarjetas de red, es muy dificil conseguir una. Entonces pensaba en la > >opción de virtualizar con linux(centos,debian,ubuntu, da igual)+kvm. > >Me gustaría saber si alguien lo ha implementado, y le funciona con > >éxito. > > > >Gracias. >