17 template<
class X,
class Y,
bool DEBUG = false>
22 std::map<X, Y> _table;
24 std::function<Y(X)> _fn;
40 const auto fitr = _table.find(x);
41 if (fitr != _table.end()) {
43 if constexpr (DEBUG) {
44 std::cout <<
"from cache:";
57 auto size()
const {
return _table.size(); }
65 double fac(
size_t n) {
67 return n == 0 ? 1 : n *
fac(n - 1);
78 for (
auto n : { 2, 9, 50, 100, 2, 9 }) {
79 std::cout << n <<
"! =" << c1.get(static_cast<size_t>(n)) << std::endl;
81 std::cout <<
"---------------------------" << std::endl;
83 for (
auto n : { 2, 9, 50, 100, 2, 9 }) {
84 std::cout << n <<
"! =" << c2.get(static_cast<size_t>(n)) << std::endl;
93 using namespace std::chrono;
100 auto start1 = steady_clock::now();
101 for (
size_t n = 0; n <
N; n++) {
102 sum1 += 1 / c1.get(n);
104 auto end1 = steady_clock::now();
105 auto dt1 = duration<double, std::milli>(end1 - start1).count();
109 auto start2 = steady_clock::now();
110 for (
size_t n = 0; n <
N; n++) {
111 sum2 += 1 / c1.get(n);
113 auto end2 = steady_clock::now();
114 auto dt2 = duration<double, std::milli>(end2 - start2).count();
117 std::cout <<
"dt1=" << dt1 <<
" ms" << std::endl;
118 std::cout <<
"value=" << sum1 << std::endl;
119 std::cout <<
"---------------------------" << std::endl;
120 std::cout <<
"dt2=" << dt2 <<
" ms" << std::endl;
121 std::cout <<
"value=" << sum2 << std::endl;
122 std::cout <<
"---------------------------" << std::endl;
123 std::cout <<
"dt2/dt1=" << dt2 / dt1 << std::endl;
124 std::cout <<
"cache size=" << c1.size() << std::endl;
void ex2()
ex2 Berechnung eines Näherungswerts für e mit 1+1/2!+1/3!+...
static constexpr double E
The Cache class Erzeugen von Zwischenspeicher für Funktionswerte.
Cache(Y(*fn)(X))
Cache Konstruktor.
double fac(size_t n)
fac Berechnung von n! exakt oder mit einer Näherungsformel
static constexpr double PI