#include #include #include #include main(int argc, char *argv[]) { int i; double a,b,ab,fa,fb,fab; double tol; char *usage = "usage: %s [tolerance]\n"; if(argc==1) { tol = 0.001; } else if(argc==2) { sscanf(argv[1], "%lf", &tol); } else { fprintf(stderr, usage, argv[0]); exit(1); } a=3.0; b=3.5; i=0; printf("------------------------------------------------------------------------------------------------\n"); printf("|iteration | a | (a+b)/2 | b | f(a) | f(b) | f((a+b)/2) |\n"); printf("------------------------------------------------------------------------------------------------\n"); while(fabs(b-a)>tol) { i++; ab=(a+b)/2; fa=sin(a); fb=sin(b); fab=sin(ab); printf("|%8d: |%12.8lf |%12.8lf |%12.8lf |%12.8lf |%12.8lf |%12.8lf |\n", i,a,ab,b,fa,fab,fb); if(fa*fab<0) b=ab; else if(fab*fb<0) a=ab; else { fprintf(stderr,"no zero in (%lf,%lf)\n",a,b); break; } } printf("------------------------------------------------------------------------------------------------\n"); printf("zero of sin(x) found at %12.8lf in %d iterations (tolerance is %lf, exact value is %12.8lf)\n\n\n", ab,i,tol,M_PI); a=2.0; b=3.0; i=0; printf("------------------------------------------------------------------------------------------------\n"); printf("|iteration | a | (a+b)/2 | b | f(a) | f(b) | f((a+b)/2) |\n"); printf("------------------------------------------------------------------------------------------------\n"); while(fabs(b-a)>tol) { i++; ab=(a+b)/2; fa=pow(a,3.0)-11.0; fb=pow(b,3.0)-11.0; fab=pow(ab,3.0)-11.0; printf("|%8d: |%12.8lf |%12.8lf |%12.8lf |%12.8lf |%12.8lf |%12.8lf |\n", i,a,ab,b,fa,fab,fb); if(fa*fab<0) b=ab; else if(fab*fb<0) a=ab; else { fprintf(stderr,"no zero in (%lf,%lf)\n",a,b); break; } } printf("------------------------------------------------------------------------------------------------\n"); printf("zero of x^3-11 found at %12.8lf in %d iterations (tolerance is %lf, exact value is %12.8lf)\n", ab,i,tol,pow(11,1.0/3.0)); }