diff --git a/Serie05/pi/Makefile b/Serie05/pi/Makefile new file mode 100644 index 0000000..9f2231e --- /dev/null +++ b/Serie05/pi/Makefile @@ -0,0 +1,12 @@ +OPTIM+=-O3 -march=native +CXX=g++ +CC=g++ +LD=${CXX} +CXXFLAGS+=-Wall -Wextra -std=c++11 $(OPTIM) +LDFLAGS+=-lm +EXE=pi + +all: clean $(EXE) + +clean: + rm -f $(EXE) *.o *~ diff --git a/Serie05/pi/pi.cc b/Serie05/pi/pi.cc new file mode 100644 index 0000000..1857d6b --- /dev/null +++ b/Serie05/pi/pi.cc @@ -0,0 +1,47 @@ +/* + This exercise is taken from the class Parallel Programming Workshop (MPI, + OpenMP and Advanced Topics) at HLRS given by Rolf Rabenseifner + */ + +#include +#include +#include + +using clk = std::chrono::high_resolution_clock; +using second = std::chrono::duration; +using time_point = std::chrono::time_point; + +inline int digit(double x, int n) { + return std::trunc(x * std::pow(10., n)) - std::trunc(x * std::pow(10., n - 1)) *10.; +} + +inline double f(double a) { return (4. / (1. + a * a)); } + +const int n = 10000000; + +int main(int /* argc */ , char ** /* argv */) { + int i; + double dx, x, sum, pi; + + auto t1 = clk::now(); + + /* calculate pi = integral [0..1] 4 / (1 + x**2) dx */ + dx = 1. / n; + sum = 0.0; + for (i = 0; i < n; i++) { + x = 1. * i * dx; + sum = sum + f(x); + } + pi = dx * sum; + + second elapsed = clk::now() - t1; + + std::printf("computed pi = %.16g\n", pi); + std::printf("wall clock time (chrono) = %.4gs\n", elapsed.count()); + + for(int d = 1; d <= 15; ++d) { + std::printf("%d", digit(pi, d)); + } + + return 0; +}