/* Double exponential formula */ #include #include #include #define MAX 100 #define EPS1 1.0e-16 #define EPS2 1.0e-12 #define PI 3.1415926535897932 double interval(double *xa, double *xb); double trapezoidal(double h, double *xa, double *xb, double s); double func(double x); int main(void) { double *xa, *xb, s = 0.0, h = 1.0, s0 = 0.0, I; xa = malloc(sizeof(double)); xb = malloc(sizeof(double)); I = 4.442882938158366101788487867452204227448; /* B(1/4,3/4) */ s = interval(xa,xb); printf("[%5.3e,%5.3e]\n",*xa,*xb); printf("%15.8e %20.15f %15.8e %15.8e\n",h,s,s-I,s-s0); while(fabs(s-s0) > EPS2){ s0 = s; h *= 0.5; s = trapezoidal(h,xa,xb,s); printf("%15.8e %20.15f %15.8e %15.8e\n",h,s,s-I,s-s0); } free(xa); free(xb); return 0; } double interval(double *xa, double *xb) { int m, n; double x, fx, fx0, fxp, w, h = 1.0, s; x = 0.0; fx = func(x); fx0 = fx; fxp = fx; x += h; fx = func(x); n = 1; s = h * (fxp + fx); w = fabs(fxp) + fabs(fx); /* determination of upper boundary */ while(w>EPS1 && nEPS1 && m