#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 2*x-1;  /* 零点を求める函数 */
}
int main(void){
    int i;
    double x,y,z,fx,fy,fz,m;
    double A=(double)0, B=(double)1;
    double epsilon=1.0e-16;
    printf("条件判断が fx*fz<0 と fy*fz<0 両方のとき:\n");
    x = A;
    y = B;
    fx = f(x);
    fy = f(y);
    for(i = 1; i <= 60; i++){ //実際には 54 で十分
        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 if (fy*fz < 0){
            x = z; fx = fz;
	} else {
	    break;
        }
        if (y == x) break;
    }
    printf("零点の近似値: %18.15lf\n",z);
    printf("条件判断が fx*fz<=0 のみのとき:\n");
    x = A;
    y = B;
    fx = f(x);
    fy = f(y);
    for(i = 1; i <= 60; i++){ //実際には 54 で十分
        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;
    }
    printf("零点の近似値: %18.15lf\n",z);
    printf("条件判断が fx*fz< 0 のみのとき:\n");
    x = A;
    y = B;
    fx = f(x);
    fy = f(y);
    for(i = 1; i <= 60; i++){ //実際には 54 で十分
        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;
    }
    printf("零点の近似値: %18.15lf\n",z);
}

