• ベストアンサー

while文でπ/4の近似値を求める

π/4=1-(1/3)+(1/5)-(1/7)+(1/9)-(1/11)+...... 上式でπ/4を求める時、第何項まで求めれば 3.14159/4との差の絶対値が0.0001より小になるか その項数とそのときのπ/4の近似値を求めよ という問題なんですが、 3.14159/4との差の絶対値が0.0001より小になるという 部分がわかりません・・。 私は、3.14159を4で割ったものが0.7853975を使って 下のようにしたのですが、うまくできません。 上式のようにプラスとマイナスが繰り返される場合 sum=-sumという風にするというのは習ったのですが・・ 計算式だとうまくいきません・・・ 初心者でプログラミング始めたばかりなので わかりやすく教えていただけると嬉しいです。 私の作ってみたプログラムは一応こんな感じです。 #include<stdio.h> #include<conio.h> int main(void){ int k,i=0; double sum; sum = 0,0; printf("k = "); scanf("%d",&k); while(0.7853975-sum<0.0001){ i++; sum=-sum; sum=(double)1/((2*i)-1); } printf("第%d項までの和は%f\n",k,sum); getch(); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.5

>1-(1/3)+(1/5)-(1/7)+(1/9)-(1/11)+......  これをよくみると、    (1/1)-(1/3)+(1/5)-(1/7)+(1/9)-(1/11) と同じ。 ★全項が共通形式となり思考が容易となる。←《重要》  ・分母は奇数 ( 2n + 1 )◆  ・ひとつおきに引き算(負の和)▼ ----------------------------------------------- #include <stdio.h> #include <math.h> void main() {  int iKou = 0;  double dSum = 0.0, dWork = 1.0;  while( dWork > 0.0001 ){ // 0.0000001 で 327484 項   dWork = 1.0; // 分子   dWork /= ( (double)iKou * 2.0 + 1.0 ); // 分母◆   if( iKou % 2 ) dWork *= -1.0; // ▼   dSum += dWork; // ▼   dWork = fabs( 0.7853975 - dSum );   iKou++;  }  printf( "第 %d 項までで、πは %f\n", iKou, ( 4.0 * dSum ) ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。   (Borland C++5.6.4)

kittypink7
質問者

お礼

ご回答ありがとうございます! すごくわかりやすい説明もつけてくださって 理解することができました。 プログラムもちゃんと動きました。 自分なりに変えてみて、下のようになりました。 本当に助かりました。 これからたくさん勉強していきたいと思います。 #include <stdio.h> #include <math.h> void main() { int i = 0; double sum = 0.0, sum2 = 1.0; while( sum2 > 0.0001 ){ sum2 = (double)1.0/((i * 2.0)+1.0); if(i%2){ sum2*=-1.0; } sum+=sum2; sum2=fabs( 0.7853975 - sum ); i++; } printf( "第 %d 項までで、πは %f\n", i, (4.0*sum) ); }

その他の回答 (4)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

>(-1)^nの「^」の意味はなんですか? (-1)のn乗で(-1)をn回掛けるという意味です X^2 = X * X X^3 = X * X * X

kittypink7
質問者

お礼

ご丁寧にありがとうございます! 理解できました。 ただプログラムがうまくいきませんでした・・ 私の勉強不足です。 せっかく書いてくださったのに申し訳ありません。 もう一度自分で勉強してみて プログラムが動くように頑張ってみます。

  • shiberian
  • ベストアンサー率50% (8/16)
回答No.3

No.2ですが訂正があります。 >while文の条件部分を >abs(sum-3.14159/4)<0.0001 と書きましたが、不等号の向きが逆です。 正しくは abs(sum-3.14159/4)>0.0001 です。

  • shiberian
  • ベストアンサー率50% (8/16)
回答No.2

π/4の近似をどのようにして表現するかをまず考えましょう。 1項目はマイナス、二項目はプラス、となっているのでn項目は(-1)^nになります。 よってπ/4=Σ(i=1,∞) 1/(2i+1)*(-1)^i です。 sum=sum+1/(2*i+1)*(-1)^iとして、while文でiを増加させていけばπ/4にどんどん近づいていきます。 ではどの段階でwhile文を終了させればよいのでしょうか。 その条件を指定しているのが >3.14159/4との差の絶対値が0.0001より小になるか です。 while文の条件部分を abs(sum-3.14159/4)<0.0001 とすればいいはずです。 abs()は絶対値を求める関数です。 math.hが必要になります。 while文から脱出したときのiが必要な項の数になります。

kittypink7
質問者

補足

ご丁寧な回答ありがとうございます。 わからない点がいくつかあるのですが (-1)^nの「^」の意味はなんですか? 教科書に載っていなくてまだ習ってないのです。 shiberianさんのでやってみたのですが kを入力したままプログラムが動きません・・ sum=0,0;やi++;はいらないですか?

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>上式のようにプラスとマイナスが繰り返される場合 >sum=-sumという風にするというのは習ったのですが・・ もう一度、文法を復習しましょう。 条件反射でコードを書いても、たいてい動きません。 > while(0.7853975-sum<0.0001){ 最初 sum は 0 なので、条件を満たさず、いきなりループを抜けます。 > printf("第%d項までの和は%f\n",k,sum); 第 k 項目までの和を求めるのではないですよね。

kittypink7
質問者

お礼

ご回答ありがとうございます。 自分の勉強不足です・・。 最後のprintfもなにを書いていいか わからなかったんです。 アドバイスを参考にして もう一度文法からやりなおしてみます。

関連するQ&A