Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#include <iostream>
constexpr int factorial(int n)
{
return n > 1? factorial(n-1) * n : 1;
}
constexpr double cpow(double v, int n)
{
return n ==0? 1: v * cpow(v, n-1);
}
constexpr double factor(double v, int n)
{
return cpow(v, n) / factorial(n);
}
constexpr double sum(double v, int n, int max)
{
return factor(v, n) + (max == n? 0: sum(v, n + 1, max));
}
constexpr double cexp(double v, int accuracy)
{
return sum(v, 0, accuracy);
}
int main(int argc, const char** argv)
{
constexpr double e = cexp(1, 8);
std::cout.precision(15);
std::cout << e << "\n";
}
module ecompute;
import std.stdio;
// Вариант 1, используя CTFE
static double computeE1(int n)
{
double innerCompute(int i, int m)
{
if(m <= 0)
{
return 0.0;
}
return 1.0/(
1.0 + 1.0/(
i + 1.0/(
1.0 + innerCompute(i + 2, m - 1))));
}
return 2.0 + innerCompute(2, n);
}
// Вариант 2, олдскул
template computeE2(int n)
{
private template innerCompute(int i, int m)
{
static if(m <= 0)
{
enum innerCompute = 0.0;
} else
{
enum innerCompute = 1.0/(
1.0 + 1.0/(
i + 1.0/(
1.0 + innerCompute!(i + 2, m - 1))));
}
}
enum computeE2 = 2.0 + innerCompute!(2, n);
}
void main()
{
// Вариант 1
static immutable e1 = computeE1(20);
pragma(msg, e1);
printf("Case 1, e = %1.20f \n",e1);
// Вариант 2
static immutable e2 = computeE2!(20);
pragma(msg, e2);
printf("Case 2, e = %1.20f \n",e2);
}
Вычисляем значение числа e на этапе компиляции