Re: duda conceptual C++

2011-06-01 Por tema Joe Cabezas
Felipe has hecho mi dia muy feliz, gracias de verdad, que bueno que la
comunidad este formada por gente como tú! :)
gracias por compartir tu conocimiento, sigue asi y seras inmortal (dalai
lama decia eso) :3

adios!

(archivado como correo importante tambien)

El 30 de mayo de 2011 08:31, Roberto Quiñones robe...@acshell.netescribió:

 El día 30 de mayo de 2011 05:42, Felipe kelt...@gmail.com 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
 



Re: duda conceptual C++

2011-06-01 Por tema Betto Rodriguez
Excelente Felipe, muchas gracias por el aporte!

El 1 de junio de 2011 04:21, Joe Cabezas joe.cabe...@gmail.com escribió:

 Felipe has hecho mi dia muy feliz, gracias de verdad, que bueno que la
 comunidad este formada por gente como tú! :)
 gracias por compartir tu conocimiento, sigue asi y seras inmortal (dalai
 lama decia eso) :3

 adios!

 (archivado como correo importante tambien)

 El 30 de mayo de 2011 08:31, Roberto Quiñones robe...@acshell.net
 escribió:

  El día 30 de mayo de 2011 05:42, Felipe kelt...@gmail.com 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.htmlhttp://www2.research.att.com/%7Ebs/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
  
 




-- 
*Francisco Rodríguez *

*Existen muchas soluciones - Las equivocadas y la mia.*


duda conceptual C++

2011-05-30 Por tema 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 Por tema Juan C. Olivares
2011/5/30 Joe Cabezas joe.cabe...@gmail.com

 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 Por tema 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_castfloat(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 Por tema 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 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_castfloat(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 Por tema 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 Por tema 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 kelt...@gmail.com 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 Por tema 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 Por tema 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 Por tema Roberto Quiñones
El día 30 de mayo de 2011 05:42, Felipe kelt...@gmail.com 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