自然対数の計算
log(自然対数)の計算 - みずぴー日記 にインスパイヤされて自然対数を計算してみます。 元の計算アルゴリズムは logの近似式について - 教えて!goo に詳細が載っています。
コードとしては log(自然対数)の計算 - みずぴー日記 に載っているものとほぼ同じなのですが、Perl の記述と awk の記述の違いが良く分かると思います。
#! /usr/local/bin/nawk -f
# ln.awk
# ln の計算
# usage: nawk -f ln.awk
BEGIN {
print ln_near_one(2);
print ln(100);
}
# ln_near_one(): 1 近傍で ln の精度の良い級数展開の結果を返す
# in: 数値 (x)
# out: ln(x) の近似解
# Ref: http://oshiete1.goo.ne.jp/qa1880549.html
function ln_near_one(x, X, i, sum, log10) {
X = (x - 1) / (x + 1);
for (i = 0; i <= 10; i++) {
sum = sum + 2 * (1 / (2 * i + 1)) * X ^ (2 * i + 1);
}
return sum;
}
# ln(): 自然対数を返す
# in: 数値 num
# out: ln(x) の近似解
# Ref; http://oshiete1.goo.ne.jp/qa1880549.html
function ln(num, i) {
while (abs(num - 1) >= 1) {
num = sqrt(num);
i++;
}
return (2 ^ i) * ln_near_one(num);
}
# abs(): 絶対値を返す
# in: 数値 (num)
# out: 数値 (num) の絶対値
function abs(num) {
if (num < 0) {
return -num;
} else {
return num;
}
}
実行してみます。
$ nawk -f ln.awk 0.693147 4.60517
なお、Google による解はそれぞれln(2) - Google Search とln(100) - Google Search になります。




