ページ 1 / 1
円周率を求める
Posted: 2007年9月27日(木) 20:11
by マヨネィズ
はじめまして、マヨネィズです。
C言語で円周率を求めろ、という課題がでました。
ここで過去ログを検索した所、同じような質問があったのですが、
解決されていなかったので質問します。
プログラムを作る際の条件は
1.コマンドラインから求めたい桁数を入力するとその桁数だけ円周率を出力させる。(何千何万という桁)
2.円周率を求める際に、マーチンの公式を使う。
マーチンの公式は調べた所、16*arctan(1/5)-4*arctan(1/239) ということはわかりました。
ここからどのようにすればいいのかサッパリお手上げです。
俺作ったことある!とか詳しいかたいましたら(図々しいですが)わかりやすいアドバイス
お願いします。
ちなみに、C++ではなくてただのCです。
Re:円周率を求める
Posted: 2007年9月27日(木) 21:14
by たかぎ
課題ということなので、ヒントだけ...
一度に条件を全て満たそうと思うと大変なので、
1. 桁数は少なくてもよいので、円周率を求めるプログラムを作る。
2. 多倍長演算のモジュールを作る。
3. 指定桁数まで円周率を求める。
の順番でやってみては。
Re:円周率を求める
Posted: 2007年9月28日(金) 17:59
by マヨネィズ
回答ありがとうございます。
1はできるのですが、2と3についてまったくお手上げ状態です。
Re:円周率を求める
Posted: 2007年9月28日(金) 18:21
by たかぎ
とりあえずこの辺を参考にしてみては
http://www5.airnet.ne.jp/tomy/cpro/longint.htm
指定桁まで求めるには、逆正接を級数展開で計算する必要があるかと思います。
収束条件を、指定した桁数を元に決めればどうにかなるでしょう。
ちなみに、そのものずばりのソースコードを載せることはしません。
課題だからということもありますが、一番の理由は面倒だからです。
# 一応、プログラミングは本業なので、ある程度以上の内容は無償では引き受けないことにしています。
Re:円周率を求める
Posted: 2007年10月01日(月) 19:59
by マヨネィズ
回答ありがとうございます。お礼が遅れてすいません。
逆正接の級数展開というのは
アークタンジェント(x) = 1/1*x -1/3*x^3 +1/5*x^5 ...
というやつですよね。
収束条件を指定した桁数を元に・・・というのがよくわからないのですが
級数展開で無限に増える項を指定した桁数によって制限して計算しろ。ということですか?
ついでにキー入力はコマンドラインからなので桁数を指定するのにscanf関数などは
使えないのかなと・・・よくわかりませんが。
コマンドラインっていうのは ./a.out の後に続けて・・・ということでいいんですよね。
コマンドラインからの入力はポインタのポインタを使えばできるというのは習いました。
それ以外は全然わかりません。
Re:円周率を求める
Posted: 2007年10月01日(月) 22:38
by tk-xleader
コマンドラインというのは、プログラム実行時に与えられる引数の事です。これは文字列として与えられます。
Windows環境の場合、「ファイル名を指定して実行」という風なところがあると思います。ここに、実行したいファイル名を指定すれば実行するのですが、ファイルのフルパスのあとに追加で文字列を指定できます。
例えば、Cドライブのprogramというディレクトリにprogram.exeという実行ファイルがあったとします。これを、ファイル名を指定して実行で実行するには↓
C:\program\program.exe
と入力すればいいのですが、例えば、コマンドラインから -a という文字列を受け取るとします。これを渡すには、
C:\program\program.exe -a
と入力すればいいのです。そして、これをプログラム側が受け取るためには、今までのmain関数に、引数を追加します。
int main(int argc,char *argv[/url])
{
/*コードを書く*/
return 0;
}
そして、argcはコマンドラインの数。argvはコマンドラインが順番に入った文字列ポインタの配列です。
argv[0]は必ずプログラムのフルパスになります。argc-1までの要素にコマンドラインが入っています。
Re:円周率を求める
Posted: 2007年10月01日(月) 23:25
by マヨネィズ
再度回答ありがとうございます。
ということは、自分はknopppiを使ってますが
[gcc ファイル名.c] でコンパイルした後、実行コマンドが[a.out] なので [a.out 100]と入力すれば
argvに[1]に文字列として100があるということになるんですね。
これを使えば任意の桁をコマンドラインからというのは難しくはないですね。
今、多倍長で整数で20000桁を扱うことには成功しましたが(四則演算のみですが)
少数は無理です。
級数展開すると明らかに少数が出てくるのでそれをどう処理すればいいかということで
悩んでいます。
これは何かうまいやりかたとかあるのでしょうか?
少し調べてみたら固定小数点なんちゃらというのがあったのですがよくわかりません。
Re:円周率を求める
Posted: 2007年10月02日(火) 00:09
by tk-xleader
固定小数点数ですね。Cではサポートされていませんが、たぶん扱えるはずです。
ポイントは、小数点の位置が固定であるということから、整数部と小数部に分ければいいのです。
どちらもlong型で変数を作り、どっちかを整数部、もう一方を小数部として作れるはずです。