sqrt() 関数を用いずに平方根 (2)
平方根の計算、再び - みずぴー日記 にインスパイヤされた id:Rocco であり @hi_saito です。 平方根の求め方に書かれてある方法で解いてみました。 さて、小数点を考える場合にはどうすればいいかを考えていきます。
ここでは、最初に桁を上げておき、整数の範囲で演算して、桁を下げる方法を用いています。
#! /usr/local/bin/nawk -f
# sqrt_2.awk
# 平方根を計算します
# usage: nawk -f sqrt_2.awk num dig
BEGIN {
num = ARGV[1];
dig = ARGV[2] ? ARGV[2] : 3;
print calc_sqrt(num, dig);
}
# calc_sqrt(): 平方根を求める
# in: 数値 (num)
# 有効桁数 (小数点以下 dig 桁)
# out: 数値 (num) の平方根
function calc_sqrt(num, dig, sum, i) {
if (num < 0) {
return "Err";
}
# 小数点以下を求めるため 10 の桁数の 2 倍乗を掛けておく
num = num * 10 ^ (dig * 2);
while (sum < num) {
sum = sum + (2 * i + 1); # 奇数を足して
i++; # 足した個数を数える
}
if (sum > num) {
i--;
}
# 桁数を元に戻す
return i / (10 ^ dig);
}
第 1 引数は平方根を求めたい数で、第 2 引数は桁数です。 実行してみましょう。
$ nawk -f sqrt_2.awk 31 5 5.56776 $ nawk -f sqrt_2.awk 11.1 5 3.33166
中身は巨大な整数に大して計算している関係で、あまり高速に演算できていません。




