duda conceptual C++

2011-05-30 Thread Joe Cabezas
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-05-30 Thread Juan C. Olivares
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++

2011-05-30 Thread Felipe
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++

2011-05-30 Thread Joe Cabezas
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++

2011-05-30 Thread Felipe
> 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++

2011-05-30 Thread Joe Cabezas
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++

2011-05-30 Thread Felipe
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++

2011-05-30 Thread Felipe
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++

2011-05-30 Thread Roberto Quiñones
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

2011-05-30 Thread Juan Andres Ramirez
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

2011-05-30 Thread Larry Letelier
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

2011-05-30 Thread Marco Bravo
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.
>