sqrt() 関数を用いずに平方根

パソコンなら演算が得意なのは理解出来ますが、 現在100円クラスで手に入る電卓が、... - Yahoo!知恵袋からですが、確かに平方根は安価な電卓でも高速に解くことができます。 平方根を解く方法は学校で習う開平法をはじめ多くのアルゴリズムが存在しますが、数値演算のアルゴリズムに書かれてあるアルゴリズムを awk に移植してみます。

#! /usr/local/bin/nawk -f
# sqrt.awk
# 平方根を求める
# usage: nawk -f sqrt.awk num

BEGIN {
    num = ARGV[1];

    print "my sqrt: " my_sqrt(num);         # sqrt() 関数を用いない方法
    print "sqrt:    " sqrt(num);
}

# my_sqrt():    sqrt() 関数を用いない平方根を計算
# Ref: http://www001.upp.so-net.ne.jp/y_yutaka/labo/math_algo/math_algo.html
#   in:     数値 (num)
#   out:    平方根 (last)
function my_sqrt(num,   s, last) {
    if (num <= 0) {
        return 0;
    }

    if (num > 0) {
        s = num;
    } else {
        s = 1;
    }

    do {
        last = s;
        s = (num / s + s) * 0.5;
    } while (s < last);

    return last;
}

比較的簡単なアルゴリズムで解くことができます。

$ nawk -f sqrt.awk 2
my sqrt: 1.41421
sqrt:    1.41421

余談ですが、平方根には覚え方があります。 2 や 3 や 5 の平方根はご存知の方も多いと思いますが、10 までの平方根の覚え方は以下のようなものです。 平方根 - Wikipedia のものとも違いますが、いろいろな語呂合わせがあります。

  • 2: 1.414213562: ひとよひとよにひとみごろ (一夜一夜に人見頃) or いよいよにいさんごじゅうろく (いよいよ兄さん 56)
  • 3: 1.7320508: ひとなみにおごれや (人並みにおごれや)
  • 5: 2.2360679: ふじさんろくおーむなく (富士山麓オーム鳴く)
  • 6: 2.44949: によよくよく (煮よ良く良く)
  • 7: 2.64171: な (7) にむしいない (菜に虫いない)
  • 8: 2.828427: にやにやよぶな (ニヤニヤ呼ぶな)
  • 10: 3.16228: ひとまる (10) はみいろにならぶや (一丸は三色に並ぶや)

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png