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

中身は巨大な整数に大して計算している関係で、あまり高速に演算できていません。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png