Error en ejercicio de exponencial

Iniciado por andoporto, 4 Febrero 2015, 16:19 PM

0 Miembros y 1 Visitante están viendo este tema.

andoporto

Hola!
Estoy tratando de encontrarle el error a mi ejercicio de Exponencial y no lo veo. Creo que el problema está en el tipo de dato que estoy usando en la función potencia. probé con int y a partir de la potencia 14 me la calcula mal!. Puse double y directamente me calcula todo mal y ahora pruebo con long int y tengo el mismo problema que con int.
Si alguien lo puede ver se los dejo!

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

double exponencial(int,double);
int factorial(int);
long int potencia(int,int);
int vector(int[]);

void main(void)
{
    int num;
    double tol;
    printf("Ingrese un numero entero: ");
    scanf("%d",&num);
    printf("Ingrese la tolerancia: ");
    scanf("%lf",&tol);
    printf("e elevado a %d es: %ld \n", num, exponencial(num,tol));
}
///////////////////////////////////////////////////
int factorial(int num)
{
    int f=1,i;
    for(i=1;i<=num;i++)
       f*=i;
    return f;
}
////////////////////////////////////////////////////
long int potencia(int x, int y)
{
  int i;
  long int pot=1;
  for(i=0;i<y;i++)
        pot*=x;
  printf("%ld elevado a %d es:  %d\n",x,y,pot);
  return pot;
}
/////////////////////////////////////////////////
double exponencial(int x, double t)
{
    double exp=0,tot;
    int i=0;
    do{
        tot=(double) potencia(x,i)/factorial(i);
        exp+=tot;
        ///printf("\n%d\t%f\n\t",i,exp);
        i++;
    }while(t<tot);
return exp;
}


eferion

El tipo int tiene un tamaño típico de 32 bits, de los cuales uno lo utiliza para identificar el signo del número (positivo o negativo).

El número más alto que puedes representar con un int típico es 2^31 = 2.147.483.648. Cualquier número más alto que este va a ser imposible almacenarlo en un "int". Es a partir de este punto cuando el programa empezará a funcionar raro.

Por otro lado, si yo cojo y hago:

int entero = 2000000000;
double valor = (double)( entero * 2 );


El resultado almacenado en "valor" va a ser incorrecto porque la operación "entero * 2" se realiza con tipo "int" y después se coge ese resultado y se almacena como double.

Hay librerías que disponen de formatos para trabajar con números todo lo grandes que tu quieras, pero creo que ya es algo que se escapa al alcance de la práctica. Si tu ejercicio funciona bien mientras no se desborde el int, puedes dar tu práctica como buena.

Un saludo