プロが教える店舗&オフィスのセキュリティ対策術

C言語でπの値を2万桁まで(2万という数字に特に意味はないですが大きい桁)をマーチンの公式を用いて計算したいのです。
マーチンの公式によるπの求め方は
16×アークタンジェント(1/5) - 4×アークタンジェント(1/239)
ということは分かったのですが
double型の変数を使っても扱える桁数はたかがしれているので
どのようにすればアークタンジェント(1/5)などの値を
C言語のプログラムで大きい桁まで求めることができるのでしょうか。
また何かうまい具合に計算できるアルゴリズムなどがありましたら
教えてください。
詳しい方いましたら、よろしくお願いします。
もしよければ参考プログラムなども
貼り付けていただけたら幸いです。

A 回答 (4件)

以下のURLに計算機向きのπの公式で、「円周率πを16進数で表したときの、小数第d位以下の(何桁かの?)桁の数字」を求める方法の解説がありました。

「3兆桁程度であれば、値を格納するのに64ビットのメモリがあれば十分だそうです」らしいです。πの10進数表示の桁の数字を求めるのは、さらに工夫が必要だと思いますが^^
 http://www.riverplus.net/sci/2005/05/post_83.html
    • good
    • 0
この回答へのお礼

できれば10進数でやりたいのですがさらに工夫が必要ですか。
やっぱり簡単ではないですね。
アドバイスありがとうございました。

お礼日時:2007/09/10 17:33

(No2さん同様なつかしい)



>マーチンの公式によるπの求め方は
>16×アークタンジェント(1/5) - 4×アークタンジェント(1/239)
>ということは分かったのですが

これだけですと一発で終わってしまう=「1変数の精度の桁まで」しか求まらない、では、どうしたらよいかがご質問の主旨として投稿します。

ネットで検索すると参考URLが出てきました(なんと「グレゴリー級数」は「収束が極めて遅く、数値計算にはまったく向いてはおりません」と・・・えっ?)。

私は、BLUE BACKS「パソコンで挑む円周率」(1991大野栄一)等を参考にしました。

★私の方法は、「マチンの公式をグレゴリー級数で表現し・・」、平たく言うと、マチンの公式を一発で終わらない式に変換(割り算式のΣ)する。その計算は、「商」を処理系の有効桁(大事を取ってその半分n=速度とのかねあい)ずつ蓄積しつつ、順次「余り」をπの必要桁数(/n)まで割っていくというものです。

☆「質問の主旨はこうだろう」という仮定の上での投稿で恐縮ですが、当時のソースをみたところ math.h はインクルードされていませんでした。割り算のみ・・・。
☆最新95年作のものをコンパイルしたところ、2037桁までを1秒かかりませんでした(ENIAC2037桁70時間)。

参考URL:http://www.kurims.kyoto-u.ac.jp/~ooura/pi04.pdf
    • good
    • 0
この回答へのお礼

> ★私の方法は、「マチンの公式をグレゴリー級数で表現し・・」、平たく言うと、マチンの公式を一発で終わらない式に変換(割り算式のΣ)する。その計算は、「商」を処理系の有効桁(大事を取ってその半分n=速度とのかねあい)ずつ蓄積しつつ、順次「余り」をπの必要桁数(/n)まで割っていくというものです。

なかなか難しいです。頭のキャパシティが足りないもので。笑
がんばってプログラム作りたいと思います。
アドバイスありがとうございました

お礼日時:2007/09/09 19:07

ご参考:



計算機向きのπの公式なんかもありますよ。
 http://www.pluto.ai.kyutech.ac.jp/plt/matumoto/p …

あと、こちらに、
http://www.tensyo.com/urame/prog/piHex.htm
「多倍長計算を使わずに、円周率πを多桁求めます」ってのがありました。


それにしても、なつかしい。。マチンの公式^^ 『解析概論』に載っていたのを読んで、感動した記憶がある^^
    • good
    • 0
この回答へのお礼

僕も時間が経つとこのマーチンの公式が
なつかしいなぁと思えるようになるのかなぁ。
参考URLありがとうございます。
早速調べてみます。

お礼日時:2007/09/09 18:59

★アドバイス


>C言語のプログラムで大きい桁まで求めることができるのでしょうか。
 ↑
 こいうのは多倍長演算を行います。
・この多倍長を自分で実装するのはちょっと面倒なのでフリーのライブラリなどを
 利用すれば簡単に行えると思います。
 次のリンクを参考にして下さい。
 http://oshiete1.goo.ne.jp/qa3229976.html→『ULONGLONGよりも大きい整数を扱う』
 ↑
 回答 No.4 を参考にして下さい。
・以上。

参考URL:http://oshiete1.goo.ne.jp/qa3229976.html
    • good
    • 0
この回答へのお礼

お早い回答ありがとうございます。
まさにその多倍長演算とやらをする方法がわからなかったので
参考にさせていただきます。
ありがとうございました。

お礼日時:2007/09/09 01:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!