• Domingo 20 de Abril de 2014, 05:40

Autor Tema:  Exponencial de un número  (Leído 2890 veces)

ermiguel1979

  • Miembro activo
  • **
  • Mensajes: 45
    • Ver Perfil
Exponencial de un número
« en: Miércoles 23 de Diciembre de 2009, 11:58 »
0

Publicidad 
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
  1.  
  2.  
#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
  1.  
  2.  


Un saludo!

punteroNULO

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: Exponencial de un número
« Respuesta #1 en: Viernes 25 de Diciembre de 2009, 14:37 »
0
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
  1. double factorial (double x){
  2. if(x!=1){
  3. return(x*factorial(x-1));
  4. }
  5. return 1;
  6. }
  7.  

ermiguel1979

  • Miembro activo
  • **
  • Mensajes: 45
    • Ver Perfil
Re: Exponencial de un número
« Respuesta #2 en: Viernes 25 de Diciembre de 2009, 22:10 »
0
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

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
    • http://www.bespel.com
Re: Exponencial de un número
« Respuesta #3 en: Sábado 26 de Diciembre de 2009, 01:59 »
0
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

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: Exponencial de un número
« Respuesta #4 en: Sábado 26 de Diciembre de 2009, 21:06 »
0
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.

ermiguel1979

  • Miembro activo
  • **
  • Mensajes: 45
    • Ver Perfil
Re: Exponencial de un número
« Respuesta #5 en: Martes 29 de Diciembre de 2009, 12:25 »
0
Gracias punteronulo, era justamente eso de los tipos, y algo de código. Ya lo tengo, lo mando para que lo veais. Mil gracias.

Código: C
  1.  
  2.  
/*Ejercicio 6º; Tema 3*/

//Realizar un algoritmo que lea un numero '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!
//(<> representa 'elevado a '). Siendo 'i' el primer termino que hace:
//(x<i+1>)/(i+1)! < 0.001

/*Algoritmo -> EXPONENCIAL DE UN NUMERO*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//Funcion que calcula el factorial
double factorial (double x){
   if (x!=1){
      return (x*factorial(x-1));
   }
   return 1;
}

//Cuerpo del algoritmo
int main (void){
   /*Declaracion de variables*/
   double numero;               //numero al que se calcula el exponencial
   int i=0, a;                  //contadores
   double aux;                  //intermedia
   double exponencial=1;         //salida (muestra el resultado)
   /*Leer variables*/
   printf("Introduzca el numero a calcular");
   scanf("%lf", &numero);
   
   //OPERACIONES
   /*Encontrar el termino 'i'*/
   do{
      aux=(pow(numero, i+1)/factorial(i+1));
      i++;
   }while(aux >= 0.001);
   i=i-1;
   printf("son necesarios %i terminos en la sucesionn", i);
   /*Calculo del exponencial*/
   for(a=1; a<=i; a++){
      exponencial = exponencial +((pow(numero, a))/factorial(a));
   }
   
   //RESULTADOS
   printf("%f", exponencial);
   
   return EXIT_SUCCESS;
}
Código: C
  1.  
  2.  


Un saludo desde Granada.