#include #include double f(double x){ return exp(-x*x); } double trap(double a,double b){ return (f(a)+f(b))/2*(b-a); } double g(double u,double a,double b){ return f((b-a)/2*u+(b+a)/2)*(b-a)/2; } double gauss3(double a,double b){ return g(0,a,b)/0.3e1 +0.5e1/0.6e1*g(sqrt(0.10e2)/0.5e1,a,b) +0.5e1/0.6e1*g(-sqrt(0.10e2)/0.5e1,a,b); } double quad(double a,double b){ double y1=trap(a,b); double y2=gauss3(a,b); if(fabs(y1-y2)<1e-7*(b-a)) return y2; double m=(a+b)/2; double r1=quad(a,m); double r2=quad(m,b); return r1+r2; } int main(){ printf("I=%24.15e\n",quad(-1.0,1.0)); return 0; }