还剩6页未读,继续阅读
文本内容:
周率TT不是个公式,它只是一个定值c-2r=n0古人计算圆周率,一般是用割圆法.即用圆的内接或外切正多边形来逼近圆的周长河基米德用正96边形得到圆周率小数点后3位的精度;刘徽用正3072边形得到5位精度;鲁道夫用正262边形得到了35位精度.这种基于几何的算法计算量大,速度慢,吃力不讨好.随着数学的发展,数学家们在进行数学研究时有意无意地发现了许多计算圆周率的公式.新尼茨胭同率1田无搬数翘为二三-小】1I1上产J357%-1arctanK―~=arctail£%-i4公镰源在公式”中令工:有,一--二二,工编写用公式求TC的近似值的程序,尽可能使精确位数较多#includemath.hmaindouble sum=l y=l f=
1.0;z zint i=l;whilefabsyle-8;f=-fy=f/2*i+l;sum+=y;;i++printfpi=%.14f\n,4*sum;圆周率迭代公式数学家们研究了数不清的方法来计算PL这个程序所用的公式如下pi=2+1/3*2+2/5*2+3/7*2+...2+k/2k+l*2+......至于这个公式为什么能够计算出PI,已经超出了本文的能力范围下面要做的事情就是要分析清楚程序是如何实现这个公式的我们先来验证一下这个公式#include stdio.hfloat pi=2;inti;fori=100;i=l;i--pi=pi*floati/2*i+1+2;printf%f\n,pi;getchar;浅谈计算周率匕面这个程序的结果是
3.141593编程口苗学生利用程序计算圆周率有很多方法,这里我们举四个小例子
1.统计方法本质是随机撒点,也叫蒙特卡罗法Monte Carlomethod•源代码:void method_lint Ndouble x,y,hits=0;for inti=0;iN;i++x=doublerand/RAND_MAX;y=doublerand/RAND_MAX;ifx*x+y*y
1.0hits++;printfpi:%lf\n,hits/N*4;运行结果N=4000*4000这里的time是在main函数中调用的计时功能,后面会介绍N取这么小是因为这里只是一个demo,真正要计算圆周率的话不可能这么小的
2.统计方法如果说蒙特卡罗法本质是随机撒点,那么这个本质就是均匀撒点源代码void method_2int N|doublex,y,hits=0;for x=0;xsqrtN;x++for y=0;ysqrtN;y++if x*x+y*yNhits++;printfpi:%lf\n,hits/N*4;运行结果N=4000*4000虽然结果精确度和蒙特卡罗法差不多,但快了许多,因为蒙特卡罗法每次循环都要调用rand函数来产生伪随机数不引入特殊设备的话,计算机是无法产生真正的随机数的
3.数学方法数学是一个强有力的工具,利用级数展开的公式可以快速估算圆周率源代码void method_3int Idoublepi=0,k=1;for inti=0;iI;i++,k=-kpi+=k/2*i+1;printfpi:%lf\n,pi*4;运行结果1=25因为数学方法和统计方法本质不一样,所以这里不再是循环次数N而是迭代次数I iteration
04.数学方法上面那个公式效果似乎不尽人意当然我们可以增加迭代次数,但是否有收敛更快的公式呢?看看下面这个怎么样源代码void method_4int Idoublepi=1,n=1;for inti=1;iI;i++n*=doublei/2*i+1;pi+=n;printfpi:%lf\n,pi*2;运行结果1=25Nice!可以看到,仅仅25次迭代,就有如此高的精度,且耗费时间小于
0.01秒,很不错呢对了,关于计时,其实很简单clock_t start,end;start=clock;//method_lN;//method_2N;//method_3I;method_4I;end=clockQ;printftime:%.2lf s\n,doubleend-start/CLOCKS_PER_SEC;clock_t类型和clock函数在time.h头文件中,clock调用一次即记录此时的程序已运行时间,两次调用做差,即得中间过程的运行耗时。
个人认证
优秀文档
获得点赞 0