自然対数の計算

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 Searchln(100) - Google Search になります。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png