Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] problema con resultado de e^x

Estas en el tema de problema con resultado de e^x en el foro de C/C++ en Foros del Web. Tratando de resolver la serie que da e^x. me topo que mi sumador se estanca en 2 por lo que deja de sumar cuando toca ...
  #1 (permalink)  
Antiguo 27/07/2014, 23:33
 
Fecha de Ingreso: agosto-2009
Mensajes: 110
Antigüedad: 14 años, 7 meses
Puntos: 1
problema con resultado de e^x

Tratando de resolver la serie que da e^x. me topo que mi sumador se estanca en 2 por lo que deja de sumar cuando toca sumarle decimales. tal como esta si ingreso 1 como para calcular una aproximado de e (neperiano) aprox 2.71 ...se estanca en 2. alguna sugerencia o error que vean en mi codigo?

Código:
#include <iostream>
#include <math.h>


using namespace std;

int factorial(int num){
	int fac=1;
	while(num > 1){
		fac = fac * num;
		num--;
	}
	return fac;
}

int exponencial(double x, int n){
	double exp;
	exp = pow(x,n) / factorial(n);
	return exp;
}

int main()
{
	int num;
	double e=0.0;
	cout<<"Digite un numero:";
	cin>>num;

	//el i-max varia al +infinito
	for(int i = 0;i<=20;i++){
		e = e + exponencial(num,i);
	}

	cout<<"la respuesta es "<<e<<endl;

	system("PAUSE");
	return 0;
}
  #2 (permalink)  
Antiguo 27/07/2014, 23:43
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: problema con resultado de e^x

Cambia el tipo de retorno de la funcion exponencial a algo distinto a int.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 28/07/2014, 01:04
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: problema con resultado de e^x

Cambia también el tipo y manera de calcular la función factorial. Con un tipo entero de 32 bits, te calculará correctamente hasta 12!, de 13! en adelante dará resultados erróneos (incluso negativos) por desbordamiento de enteros, y has puesto en tu bucle de cálculo que te compute 20 sumandos. Si dispones de un tipo entero de 64 bits, podrás llegar a 20! (como máximo).

Saludos,
  #4 (permalink)  
Antiguo 28/07/2014, 08:03
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: problema con resultado de e^x

Uno de los problemas que te pueden surgir radica en que el número de sumandos, que tienes fijado en 20, varía con el valor de x, a mayor valor más sumandos. Así, por ejemplo, para x = 10 tendrías que tomar para una buena aproximación 30 sumandos. Una forma de contemplar este hecho sería ir comparando el valor de "e" actual con el anterior y si es menor que un valor de precisión que fijas tú se aborta el sumatorio.

¿He dicho 30?. Pues sí. Basta con declarar las dos funciones y a la variable "fact" como double.

Y una cosita curiosa, puedes prescindir de la librería math, que por cierto en C++ es más correcto poner <cmath> que <math.h> (que es más propio de C), así como de la función "pow "mediante una variable estática, esas que conservan su valor entre las distintas llamadas a la función. Algo como:

Código C++:
Ver original
  1. double exponencial( double x , int n ) {
  2.     double exp;
  3.     static double poW = 1 ;
  4.     exp = poW / factorial( n );
  5.     poW *= x ;
  6.     return exp;
  7. }

¡¡¡Saluditos!!!

  #5 (permalink)  
Antiguo 28/07/2014, 12:48
 
Fecha de Ingreso: agosto-2009
Mensajes: 110
Antigüedad: 14 años, 7 meses
Puntos: 1
Respuesta: problema con resultado de e^x

Efectivamente poniéndolo double de retorno a la función exponencial ya me funciono, también poniéndole un topo de a lo max 12!. De todas maneras investigare sobre los detalles que proponen, desbordamiento, tamaño de bits de las variables, librerías, etc. Muchas gracias

Última edición por NaikiOwned; 28/07/2014 a las 12:59

Etiquetas: int, resultado
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:45.