どるこむ仲間の掲示板! 過去ログ倉庫 | LOG:2003/06: | |
●2003年06月インデックス
●過去ログ検索トップ
■どるこむ仲間の掲示板へ
|
[3153] 皆さんおなじみのΠの計算 (16 レス) 2003/06/18(Wed) 21:42:50 |
SAKI さん |
Web: (none) | |
昨日の新聞にΠの計算でおなじみの金田教授の話が載ってました。 πの計算式が8万行って書いていました。 πって円周を直径で割るわけですよね?(間違ってます?) なぜ?8万行? 10回改良して思い通りに動くのは2.3回だそうです。 単純に長時間走ら競ればどこまでも桁数が増えると思ってました。 ちなみに「何の役に立つ」との質問に「負荷をかけると、 プログラムや機器の不具合が見つかり、コンピュータの信頼性 や耐久性の向上に役立つ・・・・・」 そこの部分は理解できました。 πの計算って奥が深いんですね。 私も詳しいことはわかりませんが、CPUがまだ4MHzの頃、
円周率1万桁を計算するのが流行しました。 己がマシンのウェイトを減らし、アルゴリズムを改良しては、 何度も何度も多数のプログラマーによって、 改良され、誌面を飾り続けた時代があるのです。 さて円周率は直径と円周の比率を表す無理数ですが、 それを計算する方法もまた色々あるらしいです。 上記の時代も人気の式があり、それをいかに コンピュータ向けに書き下すかを勝負していたのです。 # ちなみに皆アセンブラでした…Z80/6809/8086 1000桁ぐらいまでで、時間を気にしなければ、 BASICの100行足らずのプログラムで済むのですが、 「より速く」「より長く」となると、話は違って くるのでしょう。 確か、円周率の公式にはルート(n乗根の類だったか)の逆数が 入っていたような。そして中の値が増え続け、どんどん 小さい値を足していく無限の式だと記憶しています。 ということは、精度を上げる、即ち桁数を増やすためには 各項の精度を上げなければなりません。そこいらへんが 桁数を増やすほどプログラムが長くなる理由なのでしょう。 ところで「負荷をかけると〜」の話ですが、実際に SuperPIというフリーソフト等でパソコンの耐久テストを することは、知っている人は知っている事柄です。 CPUとメモリに強い負荷がかかるので、グラフィック系の ベンチマークを回し続けるのと合わせて、実戦投入前の 関門としてよく行なわれています。 >CPUがまだ4MHzの頃、
BASICで、素数を求めるプログラムのスピードコンテストがあったような。 優勝した作品を走らせようとおもったのだけど、PC−8801のDISK BASICではメモリーが足りなくて、配列変数を確保できなかった覚えがあります。 最近のパイの計算では、FFT(高速フーリエ変換)が使われると聞いています。
FFTを性能が出るように高速化するとそれだけでもかなりの行数になります。 全体で8万行だとすると管理するのもそれなりに大変だと感じます。 しかし、計算に時間を要するホットスポットは、全体の1%程度だとも 聞いたことがあります。それだと800行でしょうか。その部分の性能が 重要となるのでしょう。まあ、800行程度ならなんとかなるか。 4. YU 2003/06/18(Wed) 23:15:32
実際にプログラムを作ってみるとわかりますが、普通のプログラム言語ではせいぜい10桁しか計算できません。
10桁の電卓をイメージしてみてください。この電卓を使って20桁の計算をしようとすると、数を10桁ごとに分けて、繰り上がりは紙にメモしてと、倍以上の手間がかかるようになります。 足し算や引き算ならまだなんとかなりますが、割り算や平方根になると、とたんに手間が増えて計算が大変になります。 桁数が増えてくると、ほかにも色々と解決しなくてはならない問題が出てくるため、数学の教科書に出てくる公式をそのままプログラム言語に変換するだけでは、世界記録どころか答えを出すことすらできません。 例えば、1億桁の数値を覚えておくには50Mバイトのメモリが必要になります。データの量が50Mバイトともなると、単純にコピーするだけでも相当な時間がかかります。 この世界はとても奥が深いのです。 5. 河野 2003/06/19(Thu) 01:36:14
学生時代に本当にπが3,14…なのか色々検証したことがありました。
最初は茶筒か何かで実測値を計算して「3,2」前後の測定結果を出していました(笑) その後「円が三角形の集合体」と言うことに着目して三角関数を使い 公式を作り電卓でかなり正確な値をはじき出しまし、「これでより正確な 円周率を導き出せる」と狂喜したこともありました、、、 でもよく考えると、三角関数の精度が、、、、、、 6. kita 2003/06/19(Thu) 02:00:37
むかし素人考えでテーラー展開とかしてπを求める式を作りました。
実際に計算するにはπの値が必要な式でしたが(アホ) 7. kita 2003/06/19(Thu) 02:09:22
あ、でも良く考えたら、その式Fをつかって繰り返し計算で(An+1=F(An)みたいにして)求めることができるのかな、と思ってみたり。局所安定性があるかどうか、だなあ。あ、でもテーラー展開なんだから何次までやったのかが精度的な問題になるのか・・ブツブツ
【6/19/3:21追加】 πの求め方というと、よく聞くのが、 [正円に内接する正n角形の周の長さ] < 円周 < [外接する正n角形の周の長さ] という関係が成り立ち、nを増やしていけば次第に正多角形は円に近づいていく。これを使えば円周率を求められる、というものですが、これって実際どうやるんでしょうね。 図形を書いてみて確かめると n*sin(π/n) < π < n*tan(π/n) が得られ、実際、 n*sin(π/n) = π (n → +∞) n*tan(π/n) = π (n → +∞) が確かめられます。 しかしこれはπを求めたことにはならない・・ すんません、高校以降私の数学はサッパリ進歩してないんです・・。 8. まりも 2003/06/19(Thu) 07:09:08
数学の力は全然要らない、モンテカルロ法(笑)。
乱数がきれいだと、けっこうよい値で求まるんですよね。 9. YU 2003/06/19(Thu) 12:57:01
いやいや、きれいな乱数を作るには、かなり高度な数学の知識が必要なんですよ。
知り合いが卒論で乱数発生プログラムを書いてましたから、その苦労はよく知っています。 10. まりも 2003/06/19(Thu) 18:53:54
きれいな乱数を得るなら、計算機言語処理系の標準ライブラリについている乱数関数は使うなと言われてますね。自分で作れと。
11. BVV5@Vice Admiral 2003/06/20(Fri) 00:48:27
Randmize(0) だったかなぁ(^^;)
12. Fukawa@博多人 2003/06/20(Fri) 07:50:39
RND(-TIME)ってのもアリかと(まて
13. CELSS@DC2R 2003/06/20(Fri) 14:13:25
自分のマシンには A/D変換ボードを載せてるので、乱数はノイズをA/D変換させて使ってます。
これって、極悪? (笑) >RND(-TIME)ってのもアリかと(まて
書こうかと思いましたが、たぶん誰も分かってはくれないだろうと思って書きませんでした。(笑) 分かる人がおられて嬉しいです。(^^) でも、今でもなぜ TIME ではなく -TIME なのかは分かりません… どなたか教えて下さいませ。 15. YU 2003/06/20(Fri) 21:29:00
N88-BASICのゲームソフトはたいてい、年月日時分秒を適当に計算してランダムシードに使ってましたね。
16. まりも 2003/06/20(Fri) 21:44:36
ソフトウェアによる乱数には、周期性があり、どんな種を選んでも、いずれは同じ数列のところに来てしまいます。ハードウェアノイズから乱数を生成することで、周期性を無くすことができます(再現性がなくなるデメリットもありますが)。 乱数の種に現時刻(再現しない値)を入れるのは、ときどき種を変えることで、みかけ周期を長くすることにあるのかなという気がします。
|