こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語の演算式

C言語のプログラミングで、4×(1-1/3+1/5-1/7+・・・・・)の式を100000項まで合計した式を作りたいです。答えは3.141591になります。

自分で作成してみたのですが、なかなか上手くいきません。
どうすればよいでしょうか?以下自分の作成したプログラムを「」内に載せます。
答えは0になってしまいます。


#include <stdio.h>
int main(void)
{

int i=0,a=1,b;

do{
i++;

if(i%2) {
a+=(-1)/(2*(i-1)+1);
}
else{
a+=1/(2*(i-1)+1);
}


}while(i<100000);

b=4*a;
printf("π=%f\n",b-1);
putchar('\n');


return (0);
}

投稿日時 - 2013-11-01 20:56:19

QNo.8329972

困ってます

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

C 言語では int 型同士の四則演算は結果も int 型になります。
特に、除算では小数点以下を切り捨てた値を返します。

つか、除算結果を集計する a もその結果を 4 倍する b も int 型じゃないですか。これでは小数点以下が無視されます。

というわけで、a と b を double 型にして、除算の分母側を double にキャストしてください。

投稿日時 - 2013-11-01 21:27:42

お礼

みなさま回答ありがとうございました。

初心者なもので皆様の回答大変ためになります。
アドバイスをもとに明日もう一度やってみます。
とくに答えが0になるのがお手上げだったので、その原因を書いてくださったno.1の方をベストアンサーとさせて頂きます。
ありがとうございました。

投稿日時 - 2013-11-03 20:44:31

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

#include <stdio.h>

int main(void)
{
double s;
int i;

for (s = i = 0; i < 100000; i++) {
double a = 1.0 / (2 * i + 1);
s += (i % 2 == 0) ? a : -a;
}
printf("%f\n", 4 * s);
return 0;
}


100000項では、誤差が多少出るようです。

投稿日時 - 2013-11-02 12:30:34

お礼

みなさま回答ありがとうございました。

初心者なもので皆様の回答大変ためになります。
アドバイスをもとに明日もう一度やってみます。
とくに答えが0になるのがお手上げだったので、その原因を書いてくださったno.1の方をベストアンサーとさせて頂きます。
ありがとうございました。

投稿日時 - 2013-11-03 20:45:02

ANo.4

あえてさらに突っ込むなら
なんで do~while
かな.

ちなみに「普通レベル」がどの分野の「普通」かにもよりますね>#3. 数値計算なら「普通」どころか「最初」といってもいいレベルだし.

投稿日時 - 2013-11-02 00:07:52

お礼

みなさま回答ありがとうございました。

初心者なもので皆様の回答大変ためになります。
アドバイスをもとに明日もう一度やってみます。
とくに答えが0になるのがお手上げだったので、その原因を書いてくださったno.1の方をベストアンサーとさせて頂きます。
ありがとうございました。

投稿日時 - 2013-11-03 20:45:42

ANo.3

他にもいろいろ突っ込みどころのあるプログラムなんですが、たぶん誰も書かないし普通レベルの本にも載ってないつっこみを。。。

このように、たくさんの数を足し算引き算するときは、大きな数→小さな数 の順に計算すると誤差が大きくなります。
小さな数→大きな数、すなわち 1/999999 項 から始めて、1 項 で終わるようにループを作りましょう。

よって
for(i=99999; i>0; i-=2)
でループすればよいです。

投稿日時 - 2013-11-01 23:17:27

お礼

みなさま回答ありがとうございました。

初心者なもので皆様の回答大変ためになります。
アドバイスをもとに明日もう一度やってみます。
とくに答えが0になるのがお手上げだったので、その原因を書いてくださったno.1の方をベストアンサーとさせて頂きます。
ありがとうございました。

投稿日時 - 2013-11-03 20:46:52

ANo.2

int a,b;doubleにすればいいけども、
変でない?!なぜ開始a=1で、出力b-1?

投稿日時 - 2013-11-01 21:55:13

お礼

みなさま回答ありがとうございました。

初心者なもので皆様の回答大変ためになります。
アドバイスをもとに明日もう一度やってみます。
とくに答えが0になるのがお手上げだったので、その原因を書いてくださったno.1の方をベストアンサーとさせて頂きます。
ありがとうございました。

投稿日時 - 2013-11-03 20:46:20

あなたにオススメの質問