Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <limits>
- #include <omp.h>
- double sum(const uint32_t &id, const uint64_t &num_steps, const uint8_t &threads_count)
- {
- double x, sum{0.};
- const double step = 1. / num_steps;
- const uint32_t chunk_size = num_steps / threads_count;
- for (uint_fast32_t i(id * chunk_size), _n((id + 1) * chunk_size); i < _n; ++i)
- {
- x = (i + 0.5) * step;
- sum += 4. / (1 + x * x);
- }
- return sum;
- }
- int main()
- {
- const uint64_t num_steps = 1000 * 1000 * 1000;
- const uint8_t threads_count = 4;
- double res[threads_count];
- #pragma omp parallel num_threads(threads_count)
- {
- uint32_t id = ::omp_get_thread_num();
- res[id] = sum(id, num_steps, threads_count);
- }
- ::std::cout.precision(::std::numeric_limits<double>::max_exponent10);
- ::std::cout << ::std::fixed << ::std::accumulate(res, res + 4, 0.) / num_steps << ::std::endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement