最も 0 に近い数を求める、最も大きな数を求める

最も0に近い数字を求める - みずぴー日記限りなく小さくするからですが、awk で扱える最も 0 に近い数字を求めてみます。

計算方法は 1 + x == 1 を満たすまで 2 で割りつづけることで求めることができます。

#! /usr/local/bin/nawk -f
# min_num.awk
# 最も 0 に近い数字を求める
# usage: nawk -f min_num.awk

BEGIN {
    # プラス側の計算
    eps = 1;
    i = 0;
    while (eps + 1 > 1) {
        eps = eps / 2;
        ++i;
    }
    print eps " = 2 ^ -" i;

    # マイナス側の計算
    eps = -1;
    i = 0;
    while (eps + 1 < 1) {
        eps = eps / 2;
        ++i;
    }
    print eps " = -1 * 2 ^ -" i;

}

この結果は awk のバリアントによらず同じです。

$ nawk -f min_num.awk
1.11022e-16 = 2 ^ -53
-5.55112e-17 = -1 * 2 ^ -54

逆に awk で扱える最も 0 から遠い値 (大きな値) を求めてみます。

#! /usr/local/bin/nawk -f
# min_num.awk
# 最も大きい数値を求める
# usage: nawk -f max_num.awk

BEGIN {
    # プラス側の計算
    eps = 1;
    i = 0;
    while (eps + 1 > eps) {
        eps = eps * 2;
        ++i;
    }
    print eps " = 2 ^ " i;

    # マイナス側の計算
    eps = -1;
    i = 0;
    while (eps + 1 > eps) {
        eps = eps * 2;
        ++i
    }
    print eps " = -1 * 2 ^ " i;

}

表示される有効桁数は awk のバリアントで違いますが、値は同じです。

$ nawk -f max_num.awk
9007199254740992 = 2 ^ 53
-18014398509481984 = -1 * 2 ^ 54

最も0に近い数字を求める - みずぴー日記を見れば分かるように Perl や Python と同じで 2 ^ 53 まで計算できることが分かります。

2 で割ると 0 になるような数字の探求 (2009-06-08)

最も0に近い数字を求める、その2 - みずぴー日記に書かれていますが、「2 で割ると 0 になるような数字」として求めるとさらに小さな数値になるそうです。

awk でもやってみましょう。

#! /usr/local/bin/nawk -f
# min_num_2.awk
# 最も 0 に近い数字を求める
# usage: nawk -f min_num_2.awk

BEGIN {
    # プラス側の計算
    eps = 1;
    i = 0;
    while (eps / 2 > 0) {
        eps = eps / 2;
        ++i;
    }
    print eps " = 2 ^ -" i;

    # マイナス側の計算
    eps = -1;
    i = 0;
    while (eps / 2 < 0) {
        eps = eps / 2;
        ++i;
    }
    print eps " = -1 * 2 ^ -" i;

}

論より証拠で実際に実行してみます。

$ nawk -f min_num_2.awk
4.94066e-324 = 2 ^ -1074
-4.94066e-324 = -1 * 2 ^ -1074

かなり小さな数まで求められましたが、前の 1.11022e-16 や -5.55112e-17 以下では数値 (1) を足すこともできないので、非常に扱う範囲の限られたものと言えるでしょう。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png