#include <stdio.h>
#include <math.h>

double gauss(double (*f)(), double x1, double x2){
    double xs[] = {-0.906179845938664, -0.538469310105683, .0, 0.538469310105683, 0.906179845938664};
    double ws[] = {0.236926885056189, 0.478628670499366, 0.568888888888889, 0.478628670499366, 0.236926885056189};
    int n = sizeof(xs)/sizeof(xs[0]);
    double res = 0;
    int i;
    for(i=0; i<n; ++i){
        res += ws[i] * (*f)((x2+x1)/2. + (x2-x1)/2.*xs[i]);
    }
    res *= (x2-x1)/2.;
    return res;
}

double f(double x){
    return 1/(1+x*x);
}
int main(void){
    double x1 = 0.33, x2 = x1+1;
    printf("gauss: %.10f\n", gauss(f, x1, x2));
    printf("artan: %.10f\n", atan(x2) - atan(x1));
    return 0;
}
