Ver Mensaje Individual
  #3 (permalink)  
Antiguo 18/02/2015, 01:12
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: duda sobre float y sacar constante e

Una pequeña correción lareto:

Cita:
Iniciado por lareto Ver Mensaje
Otra:
Código:
e += 1/ni;          //aqui "e" vale 2
Aquí 1 es un int, que dividido por cualquier otro entero mayor que 1 va a dar 0 (división entera).
Dado que en su versión, "ni" es de tipo float, el programa va a castear ese "1" a float, por lo que la división va a ser correcta.

Cita:
Iniciado por lareto Ver Mensaje
Código:
while (e != 2.718055556){
Probablemente esta desigualdad va a resultar true eternamente. Por causa de la forma en que se representan los números float o double, nunca deberían compararse de esa manera. En este caso, creo que podría ser suficiente
Código:
while (e <= 2.718055556){
Hay una explicación completa en
http://www.parashift.com/c++-faq/flo...int-arith.html
Tampoco es una forma correcta de hacer una comparación de dos float. En primer lugar, float tiene 6 dígitos significativos, el resto puedes considerarlos tranquilamente basura. Es el precio que hay que pagar a cambio de la posibilidad de manejar números grandes.

En el caso de los float, desde mi punto de vista, la forma correcta de realizar una comparación es algo tal que:

Código C++:
Ver original
  1. while ( e - 2.718055 < 1e-5 )

El motivo es que, como ha dicho lareto, las representaciones binarias de los números decimales no son todo lo precisas que nos gustaría, por lo que forzar una equivalencia 1=1 puede dar problemas en el momento en el que empiezan a entrar en acción los decimales.

La forma que propongo tiene como ventaja la flexibilidad. Puesto que las representaciones decimales están sujetas a errores de precisión, este mecanismo de comparación trata de camuflar el problema dando resultados bastante satisfactorios.