#define DEBUG 1
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void dumps(char *messtart,double *y,char *mesend){
  int i;
  unsigned char *p;
  p=(unsigned char *)y;
  printf("%s",messtart);
  for (i=0;i<8;i++){
    printf("%02x ",*(p+i));
  }
  printf("%s",mesend);
}
double f(double x){
    return exp(x)-2*x-1;  /* $BNmE@$r5a$a$kH!?t(B */
}
double g(double x){
    return exp(x)-2;      /* $B$=$NF34X?t(B */
}
int main(void){
    int i;
    double x,y,z,fx,fy,fz,m;
    double A=(double)1, B=(double)2;
    double epsilon=1.0e-16;
    /* 2$BJ,K!(B */
    x = A;
    y = B;
    fx = f(x);
    fy = f(y);
    for (i = 1; i <= 60; i++){
        z = (x + y)/2;
        fz = f(z);
        if (DEBUG){
          printf("i=%d,x=%18.15lf,    y=%18.15lf, (x+y)/2=%18.15lf\n",i,x,y,z);
          dumps("     ",&x,";"); dumps("",&y,";"); dumps("",&z,"\n");
          printf("     f(x)=%18.15lf, f(y)=%18.15lf\n",fx,fy);
          dumps("     ",&fx,";"); dumps("",&fy,"\n");
        }
        if (fx*fz < 0) {
            y = z; fy=fz;
        } else {
            x = z; fx = fz;
	} 
        if (y == x) break;
	//if (y-x < epsilon) break;
    }
    printf("Bisection method: %18.15lf  at i = %d\n",z,i);
}
