From 21d18da37ca17fecb5c6af5ebc3833cda5d2c81e Mon Sep 17 00:00:00 2001 From: Roman Korostinskiy <70313618+c71n93@users.noreply.github.com> Date: Sun, 27 Apr 2025 00:13:15 +0300 Subject: [PATCH] Add task 14.03 --- CMakeLists.txt | 2 +- week-17/CMakeLists.txt | 4 ++++ week-17/task-14-03/CMakeLists.txt | 3 +++ week-17/task-14-03/include/pi.hpp | 33 ++++++++++++++++++++++++++ week-17/task-14-03/test/CMakeLists.txt | 1 + week-17/task-14-03/test/test-14-03.cpp | 4 ++++ 6 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 week-17/CMakeLists.txt create mode 100644 week-17/task-14-03/CMakeLists.txt create mode 100644 week-17/task-14-03/include/pi.hpp create mode 100644 week-17/task-14-03/test/CMakeLists.txt create mode 100644 week-17/task-14-03/test/test-14-03.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b3d20a8..f577887 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,7 +62,7 @@ include_directories(shared) ##### subdirectories ##### -set(DIRS week-W week-2 week-3 week-4 week-5 week-6 week-7 week-8 week-9 week-10 week-11) +set(DIRS week-W week-2 week-3 week-4 week-5 week-6 week-7 week-8 week-9 week-10 week-11 week-17) foreach(DIR ${DIRS}) add_subdirectory(${DIR}) endforeach() diff --git a/week-17/CMakeLists.txt b/week-17/CMakeLists.txt new file mode 100644 index 0000000..588cffb --- /dev/null +++ b/week-17/CMakeLists.txt @@ -0,0 +1,4 @@ +set(DIRS task-14-03) +foreach(DIR ${DIRS}) + add_subdirectory(${DIR}) +endforeach() diff --git a/week-17/task-14-03/CMakeLists.txt b/week-17/task-14-03/CMakeLists.txt new file mode 100644 index 0000000..0857059 --- /dev/null +++ b/week-17/task-14-03/CMakeLists.txt @@ -0,0 +1,3 @@ +include_directories(include) + +add_subdirectory(test) diff --git a/week-17/task-14-03/include/pi.hpp b/week-17/task-14-03/include/pi.hpp new file mode 100644 index 0000000..ce794f4 --- /dev/null +++ b/week-17/task-14-03/include/pi.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include +#include +#include + +double pi(const size_t iterations) { + const unsigned int available = std::thread::hardware_concurrency(); + const size_t threads = (available == 0) ? 2 : available; + const size_t thread_iters = iterations / threads; + std::vector> futures; + for (unsigned i = 0; i < threads; ++i) { + futures.emplace_back(std::async(std::launch::async, [thread_iters] { + size_t circle_points = 0; + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution dist(0.0, 1.0); + for (size_t i = 0; i < thread_iters; ++i) { + const double x = dist(gen); + const double y = dist(gen); + if (x * x + y * y <= 1.0) { + circle_points++; + } + } + return circle_points; + })); + } + size_t circle_points = 0; + for (auto& f : futures) { + circle_points += f.get(); + } + return static_cast(4 * circle_points) / static_cast(iterations); +} diff --git a/week-17/task-14-03/test/CMakeLists.txt b/week-17/task-14-03/test/CMakeLists.txt new file mode 100644 index 0000000..11b7e7b --- /dev/null +++ b/week-17/task-14-03/test/CMakeLists.txt @@ -0,0 +1 @@ +cpp_test(test-14-03.cpp) diff --git a/week-17/task-14-03/test/test-14-03.cpp b/week-17/task-14-03/test/test-14-03.cpp new file mode 100644 index 0000000..c4c08f0 --- /dev/null +++ b/week-17/task-14-03/test/test-14-03.cpp @@ -0,0 +1,4 @@ +#include "gtest/gtest.h" +#include "pi.hpp" + +TEST(PiTest, PiTest) { EXPECT_NEAR(pi(1000000), 3.14, 0.01); }