最も 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) を足すこともできないので、非常に扱う範囲の限られたものと言えるでしょう。




