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

int main(int argc, char *argv[]) {
	int n, rank, numprocs, i;
	double PI25DT = 3.141592653589793238462643;
	double mypi, pi, h, sum, x;
	n = atoi(argv[1]);
	MPI_Init(&argc, &argv);
	MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
	h = 1.0 / (double)n;
	sum = 0.0;
	for (i = rank + 1; i <= n; i += numprocs) {
		x = h * ((double)i - 0.5);
		sum += (4.0 / (1.0 + x*x));
	}
	mypi = h * sum;
	MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,
					MPI_COMM_WORLD);
	if (rank == 0) {
		printf("pi is approximately %.16f, ", pi);
		printf("Error is %.16f\n", fabs(pi - PI25DT));
	}
	MPI_Finalize();
	return 0;
}

