Programación General > C/C++

 Exponencial de un número

(1/2) > >>

ermiguel1979:
Buenos días. Os mando este post porque tengo problemas al calcular el exponencial de un numero. Debería poder hacerlo sin funciones ni nada y, por supuesto, sin utilizar la función "exp" de la librería math.

El ejercicio dice así: Realizar un algoritmo que lea un número x mayor que cero y calcule su exponencial de la forma
e<x>=1+(x<1>/1!)+(x<2>/2!)+(x<3>/3!)+...+x<i>/i!); siendo "i" el primer término que hace |x<i+1>/(i+1)!|<0.001

La cosa es que mi programa funciona bien de 1 a 3. A partir de ahí, devuelve resultados que no son correctos, así como cuando el número iintroducido es de tipo REAL.

Aquí está el código, por si veis el/los fallos.

Gracias a todos!


--- Código: C ---  #include <stdio.h>
#include <stdlib.h>
#include <math.h>

//EXPONENCIAL DE UN NUMERO

/*Funcion que calcula el factorial de un numero*/
int factorial (int x){
   if(x!=1){
      return(x*factorial(x-1));
   }
   return 1;
}

/*Algoritmo -> Exponencial de un numero*/
int main (void){
   //DECLARACION DE VARIABLES
   double numero;               //numero al que se calcula al exponencial
   float exponumero;            //la exponencial de dicho numero (salida)
   int i=-1, a;                  //contadores
   float aproximacion, aux;      //intermedias
   /*Leer variables*/
   printf("Numero al que se calcula la exponencial: ");
   scanf("%lf", &numero);
   
   //OPERACIONES
   /*Encontrar el primer termino que cumple <0.001*/
   do{
      i=i+1;
      aproximacion=pow(numero, (i+1))/factorial(i+1);
   }while(!(aproximacion<0.001));   
   /*Calcular el factorial*/
   exponumero=1;            //asi se añade el "1+" de la sucesion
   for(a=1; a<=i; a++){
      aux=pow(numero, a)/factorial(a);
      exponumero=exponumero+aux;
   }
   
   //RESULTADOS
   printf("El exponencial de %lf es:   %ft", numero, exponumero);
   
   return 1;
}

--- Código: C ---  

Un saludo!

punteroNULO:
El problema está en la función "factorial". Porque utilizas variables de tipo int, cuando intentas calcular un factorial mayor de 12 el valor se sale del rango que puede almacenar este tipo.

La solución es tan simple como cambiar el tipo utilizado en la función:

--- Código: C ---double factorial (double x){if(x!=1){return(x*factorial(x-1));}return 1;} 

ermiguel1979:
Gracias punteronulo, es un detalle bueno. No se si será lo que busco, porque el problema lo tengo en saber el valor de "i" para ver cuantos sumandos tiene la serie y conocer cuando hay que parar el bucle que hace la operación x<i>/i!.

Voy a probar a ver. Gracias y felices fiestas!

Un saludo!

undertakos:
estuve intentando hacerlo pero no me queda y de igual manera lo intente a mano en un cuaderno y no me da bien los resultados no sera la formula?

punteroNULO:
Con el cambio de tipos el programa funciona perfectamente. Calcula el valor del expotencial y el bucle se para cuando el sumando tiene un valor inferior a 0.001.
No se que otra cosa estás buscando.

Otra cosa es que el código se puede hacer mucho más eficiente. Pero funciona.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa