#include #include #include double simpson(double (*f)(double), double a, double b, int n); double f(double); double antider_f(double); double f(double x) { // return x*x*x - x - 1.; return sin(x); } double antider_f(double x) { // return x*x*x*x/4. - x*x/2. - x; return (-cos(x)); } int main() { double a, b; int n; while (true) { printf("a, b, n:\n"); if (scanf("%lf%lf%d", &a, &b, &n) < 3 || n <= 0) break; double s = simpson(&f, a, b, n); double s0 = antider_f(b) - antider_f(a); printf("integral = %.12f\n", s); printf("must be: %.12f\n", s0); } return 0; } double simpson(double (*f)(double), double a, double b, int n) { assert(n > 0); double h = (b - a)/n; double s1 = (*f)(a) + (*f)(b); double s2 = 0.; double x = a + h; for (int i = 0; i < n - 1; ++i) { s2 += (*f)(x); x += h; } double s4 = 0.; x = a + h/2.; for (int i = 0; i < n; ++i) { s4 += (*f)(x); x += h; } return (s1 + 2.*s2 + 4.*s4)*h/6.; }