#include <cmath>
#include <iostream>
#include <iomanip>
#include <chrono>
using namespace std;
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());
}
};
double expnt(double x, double eps)
{
double sum = 1.0, term = 1.0;
for(int n = 1; abs(term) > eps; ++n) sum += term *= x/n;
return sum;
}
double fct(int nmb)
{
double f = 1;
for(int i = 2; i <= nmb; ++i) f *= i;
return f;
}
double Expnt(double x, double eps)
{
double res = 1;
for(int k = 1; (abs(pow(x,k)/fct(k))) > eps; k++)
res += pow(x,k)/fct(k);
return res;
}
int main()
{
{
muTimer mt;
double sum = 0;
for(double x = 0; x < 20; x += 0.001)
sum += expnt(x,1e-14);
mt.stop();
cout << sum << " for " << mt.duration<>() << " mks\n";
}
{
muTimer mt;
double sum = 0;
for(double x = 0; x < 20; x += 0.001)
sum += Expnt(x,1e-14);
mt.stop();
cout << sum << " for " << mt.duration<>() << " mks\n";
}
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Y2hyb25vPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIG11VGltZXIKewogICAgdXNpbmcgQ2xvY2sgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOwogICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKICAgIENsb2NrOjpkdXJhdGlvbiAgIGR1cmF0aW9uXzsKICAgIENsb2NrOjp0aW1lX3BvaW50IHN0YXJ0XyA9IENsb2NrOjpub3coKSwgc3RvcF8gPSBDbG9jazo6bm93KCk7CgogICAgbXVUaW1lcihjb25zdCBtdVRpbWVyJikgICAgICAgICAgICAgPSBkZWxldGU7CiAgICBtdVRpbWVyJiBvcGVyYXRvcj0oY29uc3QgbXVUaW1lciYpICA9IGRlbGV0ZTsKcHVibGljOgogICAgdXNpbmcgbnMgICAgICAgPSBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHM7CiAgICB1c2luZyBta3MgICAgICA9IHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM7CiAgICB1c2luZyBtcyAgICAgICA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM7CiAgICBtdVRpbWVyKCkgeyByZXNldCgpOyBzdGFydCgpOyB9CiAgICB+bXVUaW1lcigpID0gZGVmYXVsdDsKICAgIG11VGltZXImIHJlc2V0KCkKICAgIHsKICAgICAgICBkdXJhdGlvbl8gPSBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMoMCk7CiAgICAgICAgYWN0aXZlICAgID0gZmFsc2U7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgbXVUaW1lciYgc3RhcnQoKQogICAgewogICAgICAgIGlmICghYWN0aXZlKQogICAgICAgIHsKICAgICAgICAgICAgc3RhcnRfID0gQ2xvY2s6Om5vdygpOwogICAgICAgICAgICBhY3RpdmUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBtdVRpbWVyJiBzdG9wKCkKICAgIHsKICAgICAgICBpZiAoYWN0aXZlKQogICAgICAgIHsKICAgICAgICAgICAgc3RvcF8gICAgICA9IENsb2NrOjpub3coKTsKICAgICAgICAgICAgZHVyYXRpb25fICs9IHN0b3BfIC0gc3RhcnRfOwogICAgICAgICAgICBhY3RpdmUgICAgID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBta3M+CiAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGR1cmF0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPgogICAgICAgICAgICAoc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8VD4oc3RvcF8tc3RhcnRfKS5jb3VudCgpKTsKICAgIH0KfTsKCgpkb3VibGUgZXhwbnQoZG91YmxlIHgsIGRvdWJsZSBlcHMpCnsKICAgIGRvdWJsZSBzdW0gPSAxLjAsIHRlcm0gPSAxLjA7CiAgICBmb3IoaW50IG4gPSAxOyBhYnModGVybSkgPiBlcHM7ICsrbikgc3VtICs9IHRlcm0gKj0geC9uOwogICAgcmV0dXJuIHN1bTsKfQoKZG91YmxlIGZjdChpbnQgbm1iKQp7CiAgICBkb3VibGUgZiA9IDE7CiAgICBmb3IoaW50IGkgPSAyOyBpIDw9IG5tYjsgKytpKSBmICo9IGk7CiAgICByZXR1cm4gZjsKfQoKZG91YmxlIEV4cG50KGRvdWJsZSB4LCBkb3VibGUgZXBzKQp7CiAgICBkb3VibGUgcmVzID0gMTsKICAgIGZvcihpbnQgayA9IDE7IChhYnMocG93KHgsaykvZmN0KGspKSkgPiBlcHM7IGsrKykKICAgICAgICByZXMgKz0gcG93KHgsaykvZmN0KGspOwogICAgcmV0dXJuIHJlczsKfQoKaW50IG1haW4oKQp7CiAgICB7CiAgICAgICAgbXVUaW1lciBtdDsKICAgICAgICBkb3VibGUgc3VtID0gMDsKICAgICAgICBmb3IoZG91YmxlIHggPSAwOyB4IDwgMjA7IHggKz0gMC4wMDEpCiAgICAgICAgICAgIHN1bSArPSBleHBudCh4LDFlLTE0KTsKICAgICAgICBtdC5zdG9wKCk7CiAgICAgICAgY291dCA8PCBzdW0gPDwgIiAgZm9yICIgPDwgbXQuZHVyYXRpb248PigpIDw8ICIgbWtzXG4iOwogICAgfQogICAgewogICAgICAgIG11VGltZXIgbXQ7CiAgICAgICAgZG91YmxlIHN1bSA9IDA7CiAgICAgICAgZm9yKGRvdWJsZSB4ID0gMDsgeCA8IDIwOyB4ICs9IDAuMDAxKQogICAgICAgICAgICBzdW0gKz0gRXhwbnQoeCwxZS0xNCk7CiAgICAgICAgbXQuc3RvcCgpOwogICAgICAgIGNvdXQgPDwgc3VtIDw8ICIgIGZvciAiIDw8IG10LmR1cmF0aW9uPD4oKSA8PCAiIG1rc1xuIjsKICAgIH0KfQo=