『円周率πを求める』という課題についてなのですが、いくつか指定がありまして、
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:初めて質問させていただきます。
こんにちは。
すみませんが、詳しくは拝見していないのですが、
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型ですので、型が合わないので、統一しましょう。
すみませんが、詳しくは拝見していないのですが、
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:初めて質問させていただきます。
> 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を除いて同じ内容です。
その、同じ内容を関数にしておくと、より美しいコードになるでしょう。
> 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を除いて同じ内容です。
その、同じ内容を関数にしておくと、より美しいコードになるでしょう。