ページ 11

初めて質問させていただきます。

Posted: 2006年12月24日(日) 18:15
by float
『円周率πを求める』という課題についてなのですが、いくつか指定がありまして、
1、マチンの公式を使用すること。ただし、tan-1乗*1/5とtan-1乗*1/239はグレゴリ級数というを使い、xに1/5と1/239を代入してそれぞれ求めること。
2、math.hのatan()関数は使用してはならない。
3、tan-1乗*xで求めるときの級数の項数は30項目(つまりn=30)以上とする。
4、小数点以下は15桁まで表示すること。
という指定です。
いろいろ調べて、自分は下のような感じに書いてみました。

#include<stdio.h>
#include<math.h>

int main(void)
{
int i;
double PI, a1, a2, x;

a1 = 0.0;
x = 1.0/5.0;

for( i=1; i<=30; i++){
a1 =16 * pow( (-1), i-1 )/ (2*i-1)* pow( x, (2*i-1));

}

a2 = 0.0;
x = 1.0/239.0;

for( i=1; i<=30; i++){

a2 = 4 * (pow( (-1), i-1 ) / (2*i-1) )* pow( x, (2*i-1));

}

PI = a1 - a2;

printf("円周率:%18.15f\n" ,PI);

return 0;
}

でもこの式でデバックすると、うまくいかないんです。
pow( x, (2*i-1))とpow( x, (2*i-1))の式にうまく1/5と1/239を代入できなくて、
もう自分ではどうしたらよいか分からなくなってしまいました。
どうかよろしくお願いします。

Re:初めて質問させていただきます。

Posted: 2006年12月24日(日) 19:06
by 管理人
こんにちは。
すみませんが、詳しくは拝見していないのですが、
pow( x, (2*i-1))とpow( x, (2*i-1))がうまくいかないということで、ここだけ回答します。

googleなどでpowと検索してみましょう。

http://www.linux.or.jp/JM/html/LDP_man- ... pow.3.html

このようなページが出てきます。そこに

double pow(double x, double y);

と書かれています。つまりこの関数に渡す型はdouble型でなくてはならず、返り値もdouble型です。

今はiがint型ですので、型が合わないので、統一しましょう。

Re:初めて質問させていただきます。

Posted: 2006年12月24日(日) 19:22
by box
> a1 = 0.0;
> x = 1.0/5.0;
>
> for( i=1; i<=30; i++){
> a1 =16 * pow( (-1), i-1 )/ (2*i-1)* pow( x, (2*i-1));
> }

a1, a2とも同じなんですが、ループの中で毎回値を上書きしているのはまずいです。
今のコードでは、30回目に計算した値「だけ」が残っています。
総和を求める必要があります。

また、pow関数を使っている箇所は、係数の16と4を除いて同じ内容です。
その、同じ内容を関数にしておくと、より美しいコードになるでしょう。

Re:初めて質問させていただきます。

Posted: 2006年12月24日(日) 22:05
by float
管理人様、box様、御回答ありがとうございます!
教えていただいたことをふまえてやってみようと思います。