// .............................................................. bisection.c
//                                                       versione 08.APR.2003

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "corso.h"

double bisection(double x1,double x2,double accuracy,double (*ptfunz)(double x))
{
  int i;
  double b,fmid,f1,f2,xmid;

  f1=(*ptfunz)(x1);
  f2=(*ptfunz)(x2);
  if (f1*f2>=0) 
    { printf("Errore: lo zero non e' tra %.5le e %.5le!!!\n",x1,x2);
      exit(1);
    }
  if (f1>0)
    { b=x1;x1=x2;x2=b;
      b=f1;f1=f2;f2=b;
    }
  for (i=0;i<1000;i++)
    { xmid=(x1+x2)/2.0;
      fmid=(*ptfunz)(xmid);
      if (fabs(x2-x1)<accuracy || fmid==0.0) return xmid;
      if (fmid>0) x2=xmid;
      else x1=xmid;
    }
  printf("bassa precisione!!!");
  return xmid;
}



