バビロンの魔法2017年05月17日 08:57

バビロンの魔法

バビロンの魔法

兼ねて宿題にしていた、バビロニア人の方法による平方根の求め方を、C言語で書いてみる(という程のものかあ?)。

元ネタは、ここ。

平方根のアルゴリズム

「私のように数学の知識を持たない人間にも理解できるはずである。」

この一言に、自信を得る!(たんじゅん・・・)。

まあ、その通りなんだがな。

こんな簡単なアルゴリズムで、所用の値を得ることが出来る。

<2の平方根の場合>
xを2の半分(=1)にとりあえず決める。

(1回目)
1と2÷1の平均=1.5
1.5をxとする

(2回目)
1.5と2÷1.5の平均=1.416666666666667≒1.416667とする
1.416667をxとする

(3回目)
1.416667と2÷1.416667の平均=1.41421568685125≒1.414216とする
1.414216をxとする

(4回目)
1.414216と2÷1.414216の平均=1.414213562375196

ちなみに、平均を計算しているウインドウズの電卓で平方根を求めると(初めからそうすればあ?)、 1.414213562373095になる。

たった4回で、小数点以下10桁までの精度で計算できるという優れものだ。

さっそく、Cで書いてみる。

1 #include <stdio.h>
2
3 int main() {
4         int s;/*平方根を求めたい数*/
5         float x;/*うーん、敢えて言えば、sの平方根にしたい変数*/
6         float last_x;/*前のxの値*/
7         int i; /*単なるカウンター*/
8         s = 500;/*←ここでsを入力*/
9         /* xの初期値はsの半分にする(テキトー)。*/
10         x = s / 2;
11         last_x = 0;
12         /* xの値を計算する。*/
13         /*結果を比較して、以前のxの値と変わらなくなるまで繰り返す*/
14         for (i = 1; x != last_x; i = i + 1){
15                 last_x = x;/*計算前に、以前のxの値を格納*/
16                 x = (x + (s / x)) / 2;/*バビロニア人の方法*/
17                 printf("%d: %f\n", i, x);/*印刷*/
18         }
19
20         return 0;
21 }

行番号を取り込んでみる。

これなら、math.hをインクルードしなくてもいいので、コンパイルの際に-lmを後ろに付けなくてもいい。

パクった記事のC++をCに書き換えただけ。

sの値は500にしてあるが、8回目には7回目と同じ値で収束している。

とりあえず、動くことは動いたので、これでいいことにしよう。

追記:この記事は、wiki記法でアップしてみたが、面倒くさいのと1行改行が出来ないこと、段落開始の際に、強制的に字下げさせられることから、浮沈子的には好みではない。

プログラムは、整形済み文に指定すると、ちゃんと字下げされて出てきたので、見やすくなった(字は小さくなるので困るなあ)。

引用も、URLがゴチャゴチャしなくてスッキリする(これはいい!)。

うーん、迷うなあ・・・。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
kfujitoの徒然の筆者のペンネームは、
「○○子」です。
○○を記入してください。

コメント:

トラックバック