#include #include #include #include #include using namespace std; // to be integrated function double f(double x) { return 4 / (1 + x*x); } // numerical integration according to the Simpson rule // for f over the interval [a,b] using n subintervals double simpson(double (*f)(double), double a, double b, int n) { assert(n > 0 && a <= b); double value = f(a)/2 + f(b)/2; double xleft; double x = a; double sum = 0; #pragma omp parallel for \ private(xleft) \ lastprivate(x) \ reduction(+:sum) for (int i = 1; i < n; ++i) { xleft = a + (i-1) * (b - a) / n; x = a + i * (b - a) / n; sum += f(x) + 2 * f((xleft + x)/2); } value += sum; value += 2 * f((x + b)/2); value *= (b - a) / n / 3; return value; } char* cmdname; void usage() { cerr << "Usage: " << cmdname << " [# intervals]" << endl; exit(1); } int main(int argc, char** argv) { const double a = 0; const double b = 1; int N = 10000; cmdname = *argv++; --argc; if (argc > 0) { istringstream arg(*argv++); --argc; if (!(arg >> N) || N <= 0) usage(); } if (argc > 0) usage(); double sum = simpson(f, a, b, N); cout << setprecision(14) << sum << endl; cout << setprecision(14) << M_PI << endl; }