/*
  bisec.c
  =======

  Este programa encontra raizes de equacoes da forma f(x) = 0
  usando o metodo da biseccao.

 */

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

double f(double x);
int bisec(double *xE, double *xD, double epsilon);

int main()
{
  double x0, x1, epsilon;
  int flag;

  printf("x0, x1, epsilon: ");
  scanf("%lf %lf %lf", &x0, &x1, &epsilon);

  flag = bisec(&x0, &x1, epsilon);

  if (flag < 0) 
    printf("Eu me perdi!  Voce tem certeza de que o intervalo continha uma raiz?\n");
  
  printf("Extremos:\n   %.21g   %.21g\n   (dif. = %.21g  epsilon = %.21g)\n",
	 x0, x1, x1-x0, epsilon);

  printf("f(%g) = %.21g\n", x0, f(x0));
  printf("f(%g) = %.21g\n", x1, f(x1));
  printf("f(%g) = %.21g\n", (x0+x1)/2, f((x0+x1)/2));

  printf("Observacao: pi/4 = %.21g...\n", M_PI_4); /* definido em math.h */

  return 0;
}

double f(double x)
{ return tan(x)-1; }

int bisec(double *xE, double *xD, double epsilon)
{
  double yE, yD, yM, xM;
  
  while (*xD - *xE > epsilon) {
    yE=f(*xE);
    yD=f(*xD);

    xM = (*xE+*xD)/2; 
    yM=f(xM);

    if (yE*yM <= 0)
      *xD = xM;
    else if (yM*yD <= 0)
      *xE = xM;
    else
      return -1;
  }
  
  return 0;
}


