#include <iostream>
#include <iomanip>
#include <random>
#include <cmath>
using namespace std;
// Stała liczba losowań / podziałów
const unsigned long long N = 100000000ULL;
// Funkcja podcałkowa
long double f(long double x) {
return 4.0L / (1.0L + x * x);
}
// ====================== MONTE CARLO ======================
long double monteCarlo(unsigned long long &inside) {
mt19937_64 gen(random_device{}());
uniform_real_distribution<long double> dist(-1.0L, 1.0L);
inside = 0;
for (unsigned long long i = 0; i < N; ++i) {
long double x = dist(gen);
long double y = dist(gen);
if (x * x + y * y <= 1.0L)
inside++;
}
return 4.0L * inside / N;
}
// ====================== METODA PROSTOKĄTÓW ======================
long double rectangles() {
long double h = 1.0L / N;
long double sum = 0.0L;
for (unsigned long long i = 0; i < N; ++i) {
long double x = i * h;
sum += f(x);
}
return h * sum;
}
// ====================== METODA TRAPEZÓW ======================
long double trapezoids() {
long double h = 1.0L / N;
long double sum = (f(0.0L) + f(1.0L)) / 2.0L;
for (unsigned long long i = 1; i < N; ++i) {
long double x = i * h;
sum += f(x);
}
return h * sum;
}
// ====================== MAIN ======================
int main() {
cout << fixed << setprecision(30);
// Monte Carlo
unsigned long long inside;
long double pi_monte = monteCarlo(inside);
cout << "--- Metoda Monte Carlo ---\n";
cout << "Liczba punktow w kole: " << inside << endl;
cout << "Przyblizenie pi: " << pi_monte << endl;
// Prostokąty
long double pi_rect = rectangles();
cout << "\n--- Metoda prostokatow ---\n";
cout << "Przyblizenie pi: " << pi_rect << endl;
// Trapezy
long double pi_trap = trapezoids();
cout << "\n--- Metoda trapezow ---\n";
cout << "Przyblizenie pi: " << pi_trap << endl;
return 0;
}