#include <iostream>
#include <cmath>

struct taylor_result {
        int iterations;
        double value;
        double accu;
        taylor_result() : iterations(0),value(0),accu(1) {}
};

taylor_result taylor(double x,double eps = 1e-8,taylor_result res = taylor_result()){
    while(res.accu > eps){
         res.value += res.accu;
         res.iterations++;
         res.accu *= (x / (res.iterations));
    }
    return res;
}

int main(){
    double x = 3.0;
    taylor_result res = taylor(3.0,0.1);
    std::cout << res.value << "\n";
    res = taylor(3.0,0.01,res);
    std::cout << res.value << "\n";
    res = taylor(3.0,0.001,res);
    std::cout << res.value << "\n";

    std::cout << exp(3.0) << "\n";
}