/* 
 * arquivo: exp2_func.c
 * ----------------------
 * Dado x e epsilon (reais) e n, um inteiro, este programa calcula
 * exp(x) atraves da soma dos termos da serie 
 *
 * 1 + x + x^2/2! + x^3/3! + ...
 *
 * ate o valor absoluto do termo se tornar <= epsilon.
 */

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


double exp2 (double x, double epsilon); /* prototipo da funcao exp2 */


int main()
{
   double x, epsilon;

  printf("Forneca o valor de x: ");
  scanf("%lf", &x);

  printf("Forneca o valor de epsilon: ");
  scanf("%lf", &epsilon);
 
  printf("exp(%g) = %.20g [usando a serie]\n", x, exp2(x, epsilon)); 
  printf("exp(%g) = %.20g [biblioteca math]\n", x, exp(x));

  return 0;
}

/* Funcao:  double exp2 (double x, double epsilon)
 *
 * Esta funcao calcula exp(x) atraves da serie 
 *
 * 1 + x + x^2/2! + x^3/3! + ...
 *
 * ate o valor absoluto do termo se tornar <= epsilon.
 * A funcao devolve a soma aproximada obtida quando encontra um
 * tal termo.
 */

double exp2 (double x, double epsilon)
{
  int i;
  double soma = 1.0, termo = 1.0;

  i = 1;
  while (termo > epsilon || termo < -epsilon) { /*  |termo| > epsilon  */
    termo *= x / i;
    soma += termo;
    i++;
  }
  return soma;
}


/* OBS: No lugar de 
 * 
 *  while (termo > epsilon || termo < -epsilon)
 * 
 *  poderiamos usar a funcao fabs (floating abolute value): 
 * 
 *  while (fabs(termo) > epsilon)
 */ 
