/* 
 * arquivo: explog.c
 * ------------------
 * Dado numero real x (|x| < 1), este programa calcula
 * exp(log(1-x)) atraves das series de exp(x) e log(1-x).
 */

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

/************************************************************/

/* meu_exp(): estima exp(x) */
double meu_exp(double x);

/* f(): estima f(x) = log(1 - x) */
double f(double x);

/************************************************************/

int main()
{
  double x;

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

  printf("exp(log(1 - %g)) = exp(log(%g)) = %.20g [nossa serie]\n",
	 x, 1-x, meu_exp(f(x)));
  printf("exp(log(1 - %g)) = exp(log(%g)) = %.20g [biblioteca math]\n",
	 x, 1-x, exp(log(1 - x)));
  return 0;
}

/************************************************************/

double meu_exp(double x)
{
  int i;
  double s = 1.0, t = 1.0, tmp;

  for (i = 1;; i++) { 
    t *= x / i;
    tmp = s + t;
    if (s == tmp)
      break;
    s = tmp;
  }

  return s;
}

double f(double x)
{
  int i;
  double s = 0.0, tmp, pot_x=1;

  for (i = 1;; i++) {
    pot_x *= x;
    tmp = s - pot_x/i;
    if (s == tmp)
      break;
    s = tmp;
  }

  return s;
}

/************************************************************/

