#include <iostream>
#include <iomanip>
#include <random>
#include <cmath>
using namespace std;
// Funkcja podcałkowa do metod całkowych
long double f(long double x) {
return 4.0L / (1.0L + x * x);
}
// ===============================
// Metoda Monte Carlo
// ===============================
long double monteCarloPi(unsigned long long points) {
mt19937_64 gen(random_device{}());
uniform_real_distribution<long double> dist(0.0L, 1.0L);
unsigned long long inside = 0;
for (unsigned long long i = 0; i < points; ++i) {
long double x = dist(gen);
long double y = dist(gen);
if (x * x + y * y <= 1.0L)
++inside;
}
return 4.0L * inside / points;
}
// ===============================
// Metoda prostokątów (lewych)
// ===============================
long double rectangleMethod(unsigned long long n) {
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 trapezoidalMethod(unsigned long long n) {
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() {
const unsigned long long monteCarloPoints = 100000000ULL; // 100 000 000
const unsigned long long intervals = 100000000ULL;
cout << fixed << setprecision(30);
long double piMonteCarlo = monteCarloPi(monteCarloPoints);
long double piRectangle = rectangleMethod(intervals);
long double piTrapezoid = trapezoidalMethod(intervals);
cout << "Monte Carlo (" << monteCarloPoints << " punktow):\n";
cout << piMonteCarlo << "\n\n";
cout << "Metoda prostokatow:\n";
cout << piRectangle << "\n\n";
cout << "Metoda trapezow:\n";
cout << piTrapezoid << "\n";
return 0;
}