オイラーの定数

少し脱線してオイラーの定数を計算しています。 もちろん、オイラー定数を計算してみた - みずぴー日記にインスパイヤされているわけですが、ここにも書かれているように無限級数を計算する時には計算を止めるタイミングが難しいのですが、収束することを前提に値がある値よりも小さくなったら計算をやめる手法を用います。

#! /usr/local/bin/nawk -f
# eulers_const.awk
# オイラーの定数を求める
# usage: gawk -f eulers_const.awk

BEGIN {
    diff = 1e-10;

    for (i = 1;; i++) {
        i_euler = (1 / i) - log((i + 1) / i);

        eulers_const += i_euler;

        if (i_euler <= diff) {
            break;
        }
    }

    print eulers_const;
}

プログラム自体は難しくはありませんが、for 文の脱出条件を書き込んでいません。 基本的に無限ループになり、脱出するかどうかを break 文を実行するかどうかで決めています。

実行してみます。

$ nawk -f eulers_const.awk
0.577209

素の awk だと精度は高くできませんが、xgawk などの MPFR を使えるものであれば精度をもっと上げられることでしょう。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png