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:
Que más bien debería parecerse a esta otra:
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:
es equivalente a:
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