Ver Mensaje Individual
  #4 (permalink)  
Antiguo 14/09/2015, 03:28
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Error al dar valor mayor de 1 en el programa

Tu problema es, básicamente, que no has tenido en cuenta que al trabajar con float o con double no puedes realizar comparaciones de igualdad directamente (a==b). La razón (si has visto como se almacenan los números en coma flotante en el ordenador y las características de de los mismos lo entenderás) es que estas representaciones no son exactas, sino que tienen una precisión determinada (unos 6 dígitos para el caso del float). Los dígitos que no pertenecen a dicha precisión no puedes tenerlos en cuenta... y en una comparación a==b se acaban teniendo en cuenta.

En resumen, dado que a==b no se puede usar la opción es restar ambos números y verificar que el resultado se encuentra dentro de un rango determinado... algo tal que fabs(a-b)<rango. En tu caso, estás comprobando si el valor es 0... no hay problema, con algo así lo puedes comprobar: fabs(a)<rango.

¿Y esto dónde te está dando problemas? En la siguiente línea:

Código C++:
Ver original
  1. if((fxr==0)||(er<TOL)){

Que más bien debería parecerse a esta otra:

Código C++:
Ver original
  1. if((fabs(fxr)<1e-6)||(er<TOL)){

Ahora bien, también he visto otros problemillas. No van a provocar que tu problema falle... pero son cosas que se pueden mejorar para evitar errores tontos. Ya es cosa tuya corregirlos o no.

1. Si en el main trabajas con float... por qué eval_funcion trabaja con double?

Deberias homogeneizar el código. Tener diferentes precisiones obliga a realizar conversiones en los números que, en tu caso, son totalmente innecesarias.

2. Al número 2.71828... se conoce como número e. C y C++ no son ajenos a este número en particular y han previsto una función específica para calcular sus potencias. Es decir, que esto:

Código C++:
Ver original
  1. double ee = pow(2.718281828,v):

es equivalente a:

Código C++:
Ver original
  1. double ee = e(v);

Con la ventaja de que es más dificil que metas la pata al introducir la constante con los decimales... e incluso puede que la función especializada sea más rápida y precisa.

Un saludo