計算機には計算をさせたい
その昔、CPUの速度を計測するために整数演算のみを使用したベンチマークを行なっていた
時代が存在しました。有名なものではドライストーンベンチ(DHRYSTONE)やエラトステネス
のふるい(SIEVE)が挙げられますが、結果が目に見えて面白いものにn桁のπを計算すると
いうものがありました。
「πの計算のどこが整数演算だというのか」とお叱りを受けそうですが、マチンの公式だの
より速いラマヌジャンの公式だのを利用して、小数点以下のみを計算させると同時に、
計算結果を多倍長整数として保存するようにすることで、整数演算とメモリ同士のデータ
コピーだけで数千桁までの正確なπの値を計算させることができたのです。
というわけで引っ張り出してきたのが次のC言語ソースです。
元は今は亡きOh!MZの数値演算特集(そんな特集ありか?)に載っていたK&R-Cだったのですが、
ANSIにしてあります。速度をアップさせるために各サブルーチンに手を加えてあるので
多倍長整数の扱いの細かいところは今となってはよくわかりません。<(^_^;
1桁ずつ、こまめに繰り上がり(下がり)を記憶しながら四則演算しているだけなのですが・・・。
PIBENCH.Cのソース
[実行結果]
D:\HOME\MITU\PI>pibench 1000
Pi= 3. 14159 26535 89793 23846 26433 83279 50288 41971 69399 37510
58209 74944 59230 78164 06286 20899 86280 34825 34211 70679
82148 08651 32823 06647 09384 46095 50582 23172 53594 08128
48111 74502 84102 70193 85211 05559 64462 29489 54930 38196
44288 10975 66593 34461 28475 64823 37867 83165 27120 19091
45648 56692 34603 48610 45432 66482 13393 60726 02491 41273
72458 70066 06315 58817 48815 20920 96282 92540 91715 36436
78925 90360 01133 05305 48820 46652 13841 46951 94151 16094
33057 27036 57595 91953 09218 61173 81932 61179 31051 18548
07446 23799 62749 56735 18857 52724 89122 79381 83011 94912
98336 73362 44065 66430 86021 39494 63952 24737 19070 21798
60943 70277 05392 17176 29317 67523 84674 81846 76694 05132
00056 81271 45263 56082 77857 71342 75778 96091 73637 17872
14684 40901 22495 34301 46549 58537 10507 92279 68925 89235
42019 95611 21290 21960 86403 44181 59813 62977 47713 09960
51870 72113 49999 99837 29780 49951 05973 17328 16096 31859
50244 59455 34690 83026 42522 30825 33446 85035 26193 11881
71010 00313 78387 52886 58753 32083 81420 61717 76691 47303
59825 34904 28755 46873 11595 62863 88235 37875 93751 95778
18577 80532 17122 68066 13001 92787 66111 95909 21642 01989
UNIX SysV C version of PI
Elapsed time: 4 seconds.
これはPentium 90MHzでの実行結果ですが、プログラム作成当時全盛だった80286
10MHzでは2分位はかかっていたのではないでしょうか。IBMのPower RISCチップを搭載した
初代RS/6000-320Hでは10秒以下だったので、流石にRISC WorkStationは速いなあと感心したもの
でした。
(さっきMMX-233MHzで計ったら < 1 seconds だった。10000桁が120秒だし。。)