プロが教えるわが家の防犯対策術!

円周率Sを
S=4*Σ(-1)^n/(2n+1){(1/2)^(2n+1)+(1/3)^(2n+1)}
但しnは1から100まで

をつかって求めるプログラムをwhile文とif文をつかって作る
というのが目的で、

#include<stdio.h>
int main(void){
int n=0;
double a=0.5,b=0.3333333333333,S=a+b;

while(n<100){
{ if(n %2==0){ /*n is even*/
n=n+1;
a=a*1/4;
b=b*1/9;
S=S-1/(2*n+1)*(a+b);}

else{ /*n is odd*/
n=n+1;
a=a*1/4;
b=b*1/9;
S=S+1/(2*n+1)*(a+b);}
}
}S=4*S;
printf("%f",S);
return 0;
}



こう組んでみたのですが、どうもwhile文が無視されてしまうらしく
3.333333と表示されてしまいます。なぜ上手いこといかないのでしょうか?
問題点のご指摘をお願いいたします。

A 回答 (2件)

最後の


 S=4*S;
 printf("%f",S);
ここはその位置だと、最後100回目の結果しか表示できないですね。
whileのループ内に移しましょう。

while(n<100){
 if(){
  略
 }else{
  略
 }
 S=4*S;
 printf("%d : %f\n", n, S);
}

一応、結果を見やすくするため、
nの値の表示と改行もしておくべきでしょう。
    • good
    • 0
この回答へのお礼

確かに近似がどのくらい正確か調べるには、大切なことですね。
ご指摘ありがとうございました。

お礼日時:2007/05/25 07:02

× S=S-1/(2*n+1)*(a+b);


○ S=S-1./(2*n+1)*(a+b);

1/(2*n+1)と書くと整数演算が行われ結果が0になる。
1./(2*n+1)と書けば実数演算が行われ結果が0.…になります。
    • good
    • 0
この回答へのお礼

実行してみたら即うまくいきました。
ありがとうございました。

お礼日時:2007/05/25 06:10

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