#include <iostream>
#include <iomanip>
#include <cmath>
#include <chrono>
class muTimer
{
using Clock = std::chrono::high_resolution_clock;
bool active = false;
Clock::duration duration_;
Clock::time_point start_ = Clock::now(), stop_ = Clock::now();
muTimer(const muTimer&) = delete;
muTimer& operator=(const muTimer&) = delete;
public:
using ns = std::chrono::nanoseconds;
using mks = std::chrono::microseconds;
using ms = std::chrono::milliseconds;
muTimer() { reset(); start(); }
~muTimer() = default;
muTimer& reset()
{
duration_ = std::chrono::nanoseconds(0);
active = false;
return *this;
}
muTimer& start()
{
if (!active)
{
start_ = Clock::now();
active = true;
}
return *this;
}
muTimer& stop()
{
if (active)
{
stop_ = Clock::now();
duration_ += stop_ - start_;
active = false;
}
return *this;
}
template<typename T = mks>
unsigned long long duration()
{
return static_cast<unsigned long long>
(std::chrono::duration_cast<T>(stop_-start_).count());
}
};
using namespace std;
double pi = 3.14159265358;
double Paul(double x, double eps)
{
double y = 1, summa = 0, last = 1;;
for (; fabs(last) > eps;)
{
last = pow(-1, y) * pow(x, 2 * y - 1) / (2 * y - 1);
summa += last;
y+=1;
}
return pi/2 + summa;
}
double Harry(double x, double eps)
{
double summ = pi/2 - x, x2n_1 = -x;
x *= x;
for(int k = 3; fabs(x2n_1/k) > eps; k += 2)
{
x2n_1 *= -x;
summ += x2n_1/k;
}
return summ;
}
int main()
{
{
muTimer mt;
double z = 0;
for(double x = 0; x < 0.95; x += 0.000001)
z += Paul(x,1e-10);
mt.stop();
cout << z << " for " << mt.duration<>() << " mks\n";
}
{
muTimer mt;
double z = 0;
for(double x = 0; x < 0.95; x += 0.000001)
z += Harry(x,1e-10);
mt.stop();
cout << z << " for " << mt.duration<>() << " mks\n";
}
}