用C语言求π

是根据圆的面积四分之一圆的面积s=1/4(π*1*1).小单位正方形的面积是S=1.他们的面积比为π:4.在运用在这个小方格中丢米粒,落在小方格内美的那的概率相等的这种“随机”性,我就写出了如下C语言程序,请问看是哪一点出错了呢?
#include <stdlib.h> #include <stdio.h>
#include <time.h>
#define MAX 10000 //随机试验的实验次数为MAX
int count,a=0; double x, y, pi;
time_t t;
int main( void ) {

srand((unsigned) time(&t));
for(count = 0; count < MAX; count ++)
{
x = (double)(rand() % 10000);
y = (double)(rand() % 10000);
if(x*x+y*y<=1)
a=a+1; //frequence in the 1/4 circle.
}

/*Get pi*/
pi = (double)( a / MAX ) * 4.0;
printf(" Pi is = %f \n", pi);

return 0;
}

先谢谢了。

你的程序是模拟大量随机事件来求pi的近似值。有两点给你纠正的:

1、

x = (double)(rand() % 10000);

 y = (double)(rand() % 10000);

x/、y都是小于10000的数表示(x,y)这个随机点是落在了长10000,宽10000的矩形也就是正方形中,所以if (x*x+y*y <= 10000*1000)表示这个点落在了以10000为半径的圆内,所以,你的

if(x*x+y*y<=1)应该改为if (x*x+y*y <= 10000000)。

2、

 pi = (double)( a / MAX ) * 4.0;

 pi = (double)( a / MAX ) * 4.0;由于MAX是10000,a<=9999,所以a永远小于MAX所以(a/MAX)永远等于0,所以你求出的pi值永远等于0。 pi = (double)( a / MAX ) * 4.0等价于pi=(double)(0)*4.0等价于pi=0;在c语言或者c++中两个int型的变量相除结果还是int型的,如果分母大于分子结果则为0,java中好像也是的。但是分子分母中只要有一者是double或floati型的,那个整型会自动向高精度的数据类型转换。所以你的 pi = (double)( a / MAX ) * 4.0;应更正为 pi = a /(double) MAX  * 4.0;或者

pi = (double)a/MAX * 4/0;或者把double替换为float也可以滴

在我的机器上最终模拟出的pi的近似值是

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-24
用刘徽的“割圆术”公式算出来了pi——
# include <stdio.h>
# include <math.h>
main()
{
double pi = 3;
unsigned int i;
for (i=1; i<15; i++)
pi = sqrt(pi) + 2;
pi = sqrt(2 - sqrt(pi));
for (i=0; i<15; i++)
pi *= 2;
pi *= 3;
printf("pi = %.10lf\n", pi);
}
算得 3.1415926453 也算比较精确了
第2个回答  2012-09-24
楼上很精辟,如果你想控制在1以内不妨把x除以10000 别忘了float或者double

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网