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

解決済みの質問

精度を上げたいのですが…

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX 1000

main(void)
{
int i;
float x1, x2, en, sum=0.0, s;
srand( (unsigned)time( NULL ) );

for(i=0;i<MAX;i++)
{
x1=((float)rand()/(float)RAND_MAX);
x2=((float)rand()/(float)RAND_MAX);
if(en=(x1-0.5)*(x1-0.5)+(x2-0.5)*(x2-0.5)<=(0.5)*(0.5))
{
sum++;
}
}
s=sum/MAX;
printf("円の面積:%15.6e\n",s);
}

この方法で円の面積を求めたんですが、もう少し精度を上げたいと思います。ただそのプログラムをどうやって書けばいいのかさえわからずとまどっています。円全体でなくその一部を考え、またその部分を簡単に面積が求められるようにわけるプログラムを組みたいのですがどのようにすればいいのか教えてください。

投稿日時 - 2004-10-31 03:48:02

QNo.1063494

困ってます

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

No.2のプログラムは、半径1の円の1/4を求めて4倍しています(半径1の円の面積を計算している)から、半径0.5の円の面積を求めたければ1/4倍しないといけませんね。(半径1の円の面積はπ、半径0.5の円の面積は0.25π)
精度をあげるには繰り返し回数を増やすのが簡単ですかね。ただし回数を増やすとsumの数値が大きくなって精度落ちますので一定回数で区切って計算したほうがいいです。

質問の「円全体でなくその一部を考え、またその部分を簡単に面積が求められるようにわける」というのはよく意味が分かりませんでした。

投稿日時 - 2004-10-31 17:31:26

補足

円全体を考えるのではなく、ある一部を考えて、またその一部においても、簡単に面積が求められる部分にわける。って感じなんですけど。。なんかうまく伝えれなくてすいません。。とりあえず円を分割したら精度があがるのかなと。。そのプログラムが知りたいんですけど。。わかりにくい質問に答えていただいてありがとうございました!

投稿日時 - 2004-11-01 09:16:06

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

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

回答(4)

ANo.3

> なぜか円周率が求まってしまいます。。

半径1の円の面積はπですが。

投稿日時 - 2004-10-31 11:19:31

お礼

…。

ありがとうございました(笑。

投稿日時 - 2004-11-01 16:32:06

ANo.2

>円全体でなくその一部を考え・・・
円の第一象限だけ計算することができます。
半径1の円の右上の部分です。
乱数の発生の部分はそのまま中心(0,0)から距離が1未満の場合円の中にあるとカウントして最後に4倍すれば結果が出ます。

投稿日時 - 2004-10-31 04:16:11

補足

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX 1000

main(void)
{
int i;
float x1, x2, en, sum=0.0, s;
srand( (unsigned)time( NULL ) );

for(i=0;i<MAX;i++)
{
x1=((float)rand()/(float)RAND_MAX);
x2=((float)rand()/(float)RAND_MAX);
if(en=x1*x1+x2*x2<1.0)
{
sum++;
}
}
s=(sum/MAX)*4;
printf("円の面積:%15.6e\n",s);
}


としたのですが、なぜか円周率が求まってしまいます。。どこか間違っていますか?どう書き換えればいいのか教えてください。

投稿日時 - 2004-10-31 10:40:58

お礼

すいませんがどのように扇形を求めるプログラムを書けばいいのか教えてもらえないでしょうか。。わからないんです。。

えとつまりその式を4倍したらいいんですよね。

投稿日時 - 2004-11-01 20:02:34

ANo.1

乱数の質がよければ、MAXを大きくするだけでいくらでも精度が上がると思います。

投稿日時 - 2004-10-31 04:01:52

お礼

ありがとうございました。

投稿日時 - 2004-10-31 10:16:00

あなたにオススメの質問