プロが教える店舗&オフィスのセキュリティ対策術

π/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;
}

A 回答 (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)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
すごくわかりやすい説明もつけてくださって
理解することができました。
プログラムもちゃんと動きました。
自分なりに変えてみて、下のようになりました。
本当に助かりました。
これからたくさん勉強していきたいと思います。

#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) );
}

お礼日時:2008/05/23 02:07

>(-1)^nの「^」の意味はなんですか?



(-1)のn乗で(-1)をn回掛けるという意味です
X^2 = X * X
X^3 = X * X * X
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/05/23 02:09

No.2ですが訂正があります。



>while文の条件部分を
>abs(sum-3.14159/4)<0.0001

と書きましたが、不等号の向きが逆です。
正しくは

abs(sum-3.14159/4)>0.0001

です。
    • good
    • 0

π/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が必要な項の数になります。

この回答への補足

ご丁寧な回答ありがとうございます。
わからない点がいくつかあるのですが
(-1)^nの「^」の意味はなんですか?
教科書に載っていなくてまだ習ってないのです。

shiberianさんのでやってみたのですが
kを入力したままプログラムが動きません・・
sum=0,0;やi++;はいらないですか?

補足日時:2008/05/22 02:25
    • good
    • 0

>上式のようにプラスとマイナスが繰り返される場合


>sum=-sumという風にするというのは習ったのですが・・
もう一度、文法を復習しましょう。
条件反射でコードを書いても、たいてい動きません。

> while(0.7853975-sum<0.0001){
最初 sum は 0 なので、条件を満たさず、いきなりループを抜けます。

> printf("第%d項までの和は%f\n",k,sum);
第 k 項目までの和を求めるのではないですよね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/05/23 02:16

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