• 締切済み

C言語でπを2万桁まで計算するには

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

noname#40223
noname#40223

みんなの回答

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.4

以下のURLに計算機向きのπの公式で、「円周率πを16進数で表したときの、小数第d位以下の(何桁かの?)桁の数字」を求める方法の解説がありました。「3兆桁程度であれば、値を格納するのに64ビットのメモリがあれば十分だそうです」らしいです。πの10進数表示の桁の数字を求めるのは、さらに工夫が必要だと思いますが^^  http://www.riverplus.net/sci/2005/05/post_83.html

noname#40223
質問者

お礼

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

noname#48699
noname#48699
回答No.3

(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
noname#40223
質問者

お礼

> ★私の方法は、「マチンの公式をグレゴリー級数で表現し・・」、平たく言うと、マチンの公式を一発で終わらない式に変換(割り算式のΣ)する。その計算は、「商」を処理系の有効桁(大事を取ってその半分n=速度とのかねあい)ずつ蓄積しつつ、順次「余り」をπの必要桁数(/n)まで割っていくというものです。 なかなか難しいです。頭のキャパシティが足りないもので。笑 がんばってプログラム作りたいと思います。 アドバイスありがとうございました

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

ご参考: 計算機向きのπの公式なんかもありますよ。  http://www.pluto.ai.kyutech.ac.jp/plt/matumoto/pi_small/node9.html あと、こちらに、 http://www.tensyo.com/urame/prog/piHex.htm 「多倍長計算を使わずに、円周率πを多桁求めます」ってのがありました。 それにしても、なつかしい。。マチンの公式^^ 『解析概論』に載っていたのを読んで、感動した記憶がある^^

noname#40223
質問者

お礼

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

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

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

参考URL:
http://oshiete1.goo.ne.jp/qa3229976.html
noname#40223
質問者

お礼

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

関連するQ&A

  • 長い桁(小数点以下)が計算できる言語は?

    先日、円周率を求める独自のアルゴリズムで、(仮称)十進BASICを使用して1000桁まで出すことに成功しました。 しかし、(仮称)十進BASICは1000桁が限界で、これ以上詳しい値を出すことが出来ませんでした。 なので、さらに詳しい値を算出できるプログラミング言語には何があるのでしょうか? 検索してみると、独自の計算のプログラムなどを組まなければいけないとか・・・ 無限桁の桁数が扱えるプログラミング言語はないでしょうか? また、計算用のプログラムを組むとなれば、どの言語がおすすめですか? 是非教えてください。

  • C言語での桁落ち

    C言語での桁落ちの以下のプログラムを教えてください f(x)=xの5乗-ルート(1+xの10乗)+1/2×ルート(1+xの10乗) x=0,1,2・・・50 における f(x) の値を求めよ. そのまま計算した場合と式を変形して正確に計算した場合を比較せよ(一つのプログラムで両方計算). のプログラムを教えてください。

  • C言語で大きな桁数を扱う方法

    C言語でプログラムを組んでいるのですが、大きな数を扱う必要が出てきて困っています。現在、double型を使って計算していて、10^(-308)~10^(308)くらいまで扱うことが分かってるのですが、もっと大きな数字を扱うことはできませんか?小さいもの×大きなものでnanが出てきて困っています。具体的にはexp(±631200)(すみません。何桁になるか分かりません)ぐらいまで扱えるようになりたいです。初心者ですがよろしくお願いします。

  • C言語で確保できるビットの桁数

    C言語でビット単位でデータ操作する際に、確保できるビットの桁数はたとえば以下のような例の場合 unsigned char bit; 1バイト(=8ビット)なので8桁ということは勉強しました。 ここで、たとえば計算でビットの桁数を100桁用意したい場合 以下のように32*4桁という風に分ける方法しかないのでしょうか? unsigned int bit[4]; できれば一つの変数で済ませたいのですが、何か良い方法をご存知の方いらっしゃいましたらよろしくお願いします。

  • 大きな桁の計算はどうやるの?

    double型で計算しきれない桁数のの計算はどうすればいいのでしょうか。 4桁の問題を80問やったときにまぐれで全問正解する確率を計算したいのですが int i; double x=4; for(i=1;i<80;i++){ x = x * 4; } printf(" %f 分の1 \n",x); これでは結果が e と出てしまって計算できません。 どなたか教えてください><

  • C言語で複素数の計算を行いたいと思っております。

    C言語で複素数の計算を行いたいと思っております。 プログラミングソフトは、C言語を始めよう!を用いています。 しかし変数定義の仕方が分かりません。 複素計算とは具体的に、 exp( i π) (i は虚数単位)です 最初に#include<complex.h>を行いましたが 変数の定義の方法、exp( i π)の定義の方法が いまひとつわからない状態です。 保存するときに、Cファイルではなく、 拡張子をcppに変更してCPPファイルでコンパイルを行っています。 exp( i π)を計算可能なプログラムを 教えて頂ければ幸いです。 ご面倒かと思いますが 回答お願いします。

  • 計算させるのに便利なプログラム言語

    エクセルだと1000桁の計算を表示させる事ができません そこでプログラムでエクセルみたいに計算させれば 計算できるかもしれないと思ったのですが これはこれで無理なんですかね。。 たとえば 7000C0から7000C7000までを(C=コンビネーション) 自動で計算させるのに最適な方法はなんなのでしょうか。 エクセルだと7000C200辺りで#NUM!で計算できなく なってしまいます。 今やろうとしていることは、計算の桁も1000桁以上になり、 計算回数は1億くらいになってしまいます これを行うために、計算に強いプログラム言語はあるのでしょうか。

  • 計算の便利なプログラム言語

    エクセルだと1000桁の計算を表示させる事ができません そこでプログラムでエクセルみたいに計算させれば 計算できるかもしれないと思ったのですが これはこれで無理なんですかね。。 たとえば 7000C0から7000C7000までを(C=コンビネーション) 自動で計算させるのに最適な方法はなんなのでしょうか。 エクセルだと7000C200辺りで#NUM!で計算できなく なってしまいます。 今やろうとしていることは、計算の桁も1000桁以上になり、 計算回数は1億くらいになってしまいます これを行うために、計算に強いプログラム言語はあるのでしょうか。

  • 多桁計算

    階乗の多桁計算をしたいのですが、プログラムの仕方を教えてください。 具体的には、217!とかを計算したいです。普通にやると桁が溢れてしまいます。 できれば、CかPerlでお願いします。

  • C言語 変数型 (*)() の意味を教えて下さい

    C言語で書かれたプログラムを見ていると、変数宣言の部分に double (*f)(); のような形で書かれたものがよく出てきます。 これは、どういうことを意味しているのでしょうか? よろしくお願いいたします。

専門家に質問してみよう