C
C++
数学

ネイピア数の実装 [C/C++]


ネイピア数

今回はC99とC++14で動作するネイピア数eを計算するプログラムを作成する。


関数e1の実装


元の式

$\displaystyle e = \lim_{t \to 0} \left(1 + t \right )^\frac{1}{t}$


近似式

$\displaystyle t = \frac{1}{2^{51}}$

$\displaystyle e = \left(1 + t \right )^\frac{1}{t}$


関数e2の実装


元の式

$\displaystyle e = \sum_{n \to 0}^{\infty} \left(\frac{1}{n!} \right )$


近似式

$\displaystyle e = 2+\sum_{n \to 2}^{18} \left(\frac{1}{n!} \right )$


ソースコード


C99

#include <stdio.h>

#include <stdint.h>
#include <math.h>

typedef uint_fast64_t u64;

//lim t->0 (1+t)^(1/t)
static const double t = 1.0 / ((u64)1 << 51);
double e1() {
return pow(1.0 + t, 1.0 / t);
}

//sigma n=0~18 (1/n!)
double e2() {
double e = 2.0;
u64 n;
for (u64 i = (u64)2; i < (u64)18; ++i) {
n = (u64)1;
for (u64 j = (u64)2; j <= i; ++j) n *= j;
e += (1.0 / n);
}
return e;
}
static const double e = e2();
static const double ee = 2.718281828459045;

int main() {
printf("%.16f\n", e1());
printf("%.16f\n", e2());
printf("%.16f\n", e);
printf("%.16f\n", ee);
return 0;
}



C++14

#include <cstdio>

#include <cstdint>
#include <cmath>

namespace math {

using u64 = uint_fast64_t;

//lim t->0 (1+t)^(1/t)
constexpr double t{ 1.0 / ((u64)1 << 51) };
double e1(const double t_ = t) {
return std::pow(1.0 + t_, 1.0 / t_);
}

//sigma n=0~18 (1/n!)
constexpr double e2() {
double e{ 2.0 };
u64 n{};
for (u64 i = (u64)2; i < (u64)18; ++i) {
n = (u64)1;
for (u64 j = (u64)2; j <= i; ++j) n *= j;
e += (1.0 / n);
}
return e;
}
constexpr double e{ e2() };
constexpr double ee{ 2.718281828459045 };

}

int main() {
std::printf("%.16f\n", math::e1());
std::printf("%.16f\n", math::e2());
std::printf("%.16f\n", math::e);
std::printf("%.16f\n", math::ee);
return 0;
}



実行結果

2.7182818284590446

2.7182818284590455
2.7182818284590455
2.7182818284590451


ソースコードのライセンス

These codes are licensed under CC0.

CC0

ソースコードは自由に使用してください。