π值算法分析

上传人:M****1 文档编号:487701937 上传时间:2024-01-27 格式:DOCX 页数:9 大小:36.36KB
返回 下载 相关 举报
π值算法分析_第1页
第1页 / 共9页
π值算法分析_第2页
第2页 / 共9页
π值算法分析_第3页
第3页 / 共9页
π值算法分析_第4页
第4页 / 共9页
π值算法分析_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《π值算法分析》由会员分享,可在线阅读,更多相关《π值算法分析(9页珍藏版)》请在金锄头文库上搜索。

1、关于“ n”值计算的算法分析研究电子科技大学电子工程学院LawrenceXu、简介圆周率,一般以n来表示,是一个在数学及物理学中普遍存在的 数学常数。它定义为圆形之周长与直径之比。它也等于圆形之面积与 半径平方之比。是精确计算圆周长、圆面积、球体积等几何形状的关 键值。在分析学里,n可以严格地定义为满足sinx=0的最小正实 数x。n在很多数学领域里都有很大的作用:1111177Leibniz定理:亍-概率论:设我们有一个以平行且等距木纹铺成地板,随意抛一支 长度比木纹之间距离小的针,求针和其中一条木纹相交的概率。这就 是布丰投针问题。1777年布丰自己解决了这个问题这个概率值 是 1/n。定

2、义圆周率不一定要用到几何概念,比如,我们可以定义n为满 足sinx=0的最小正实数X。艺芒一 J一十(TW祕这里的正弦函数定义为幕级数从而,从古到今,计算n的值成为了一个流行于世界数学界的问题。 现在利用计算机可以将n值计算到小数点后数亿位。学完算法分析与 设计后,觉得可以用几种不同的算法来计算的值。二、具体算法及C语言实现11111_ 7TI.Leib niz定理:了 亍亍二三C代码为:DefineNIOOOOOOO#includevstdio.hintmain()intj;doublei,pai=1;for(i=3,j=-1;ivN;i二i+2,j*=-1)pai+ = 1/i*j;pri

3、ntf( n=%lf,4*pai);return。;运行结果:3.141592,发现N = 10000000时才能与真实值温和到7位,N = 1000000 ,则结果为 3.141591。2级数算法C代码:(这是我在网上看到的代码,算到了 800位,觉得很神奇后面有我自己对这个算法的一点分析)#includevstdio.hlonga = 10000,b,c=28000,d,e,f28010,g; voidmain()for(;b-c;)fb+二a/5;for(;d=0,g=c*2;c-=14,printf(%.4d,e+d/a),e二d%a) for(b=c;d +=fb*a,fb=d%-g

4、,d/=g-/-b;d*=b);结果为:D碉代码tt计算 Debu gri计算.exe31415926535897932384626433832795028841971693993751058209749445923078164062862089 98628034825342117067982148086513282306647093844609550582231725359408128481117450 28410270193852110555964462294895493038196442881097566593344612847564823378678316 52712019091456

5、485669234603486104543266482133936072602491412737245870066063155881 74881520920962829254091715364367892590360011330530548820466521384146951941511609 43305727036575959195309218611738193261179310511854807446237996274956735188575272 48912279381830119491298336733624406566430860213949463952247371907021798

6、609437027 70539217176293176752384674818467669405132000568127145263560827785771342757789609 17363717872146844090122495343014654958537105079227968925892354201995611212902196 08640344181598136297747713099605187072113499999983729780499510597317328160963185 95024459455346908302642522308253344685035261931

7、188171010003137838752886587533208 38142061717766914730359825349042875546873115956286388235378759375195778185778053 21712268066130019278766111959092164201989380952572010654858632788659361533818279 68230301952035301852968995773622599413891249721775283479131515574857242454150695 95082953311686172785588

8、907509838175463746493931925506040092770167113900984882401 28583616035637076601047101819429555961989467678374494482553797747268471040475346 46208046684259069491293313677028989152104752162056966024058038150193511253382430 03558764024749647326391419927260426992279678235478163600934172164121992458631503

9、 02861829745557067498385054945885869269956909272107975093029553211653449872027559 60236480665499119881834797753566369807426542527862551818417574672890977772793800 08164706001614524919217321721477235014144197356854816136115735255213347574184946 84385233239073941433345477624168625189835694855620992192

10、221842725502542568876717 904946016534668049886272327917860857843838279679766814541Q0953883786360950680064 22512520511739298489608412848862694560424196528502221066118630674427862203919494 此文简体-吞薩输入法半:因为是网上看到的算法,看了半天才懂觉得很妙,下面给出几点分析:一、算法1、这个算法用到的n的计算公式(级数中的一种0n /2=1+1!/3!+2!/5!+3!/7!+.+k!/(2*k+1)!+.2、公

11、式的程序实现(数组存储余数)把上面的公式做一下展开和调整n /2 = 1 + 1!/3! + 2!/5! + 引/7! + . + k!/(2*k+1)!=1 + 1/3 + (1*2)/(3*5) + (1*2*3)/(3*5*7) + . + (1*2*.*k)/(3*5*.*(2k+1)=1 + 1/3 + (1/3)*(2/5) + (1/3)*(2/5)*(3/7) + . + (1/3)*(2/5)*. *(k/(2k+1)=(1/3)*(2/5)*.*(k/(2k+1) + . + (1/3)*(2/5)*(3/7) + (1/3)*(2/5)+ 1/3 + 1=(k/(2k+1

12、)*.*(2/5)*(1/3) + . + (3/7)*(2/5)*(1/3) + (2/5)*(1/3)+ 1/3 + 1=(k/(2k+1)+1)*(k-1)/(2(k-1)+1)+1)*.)*3/7+1)*2/5+1)*1/3+1)/1=(1/(2k+1)*k+1)/(2(k-1)+1)*(k-1)+1)/.)/7*3+1)/5*2+1)/3*1+1)/1我们要做的就是做除法、做乘法、加1,做除法、做乘法、 加1,.,这样直到做除法除以1。那么我们就可以在一个循 环中完成它,用一个计数器i,1除以2i+1、乘以i、加1, 循环。但是我们要输出800位小数,就只能用大数除法的办 法了:分为

13、n趟执行,这一趟把公式中每一次除法的余数保 存下来,把商累计后输出;下一趟把保存的余数提高精度再 做除法,把余数保存下来,把商累计后输出,以此类推。根 据数学运算,当k=2800时,可以精确到小数点后800位(实 际上是精确到小数点后844位),那么我们就设定一个2800 的数组,全部初始化为1 (也就是设定余数为1,就是公式 中加的1),然后在循环中不断的做除法、乘法、加余数,过 程中还要保存余数,和手工除法一样。提高精度的办法,比如f2800,初始值为1,除以5601、乘 以2800,把商的整数部分加1放到下一项的运算中,余数保 存下来,在下一趟乘以10,再除以5601、乘以2800,得到

14、 的商的整数部分就是上一趟运算结果的后一位数字。我们如 果要每次输出4位数字,那么就要乘以10000,得到的商的 整数部分不会超过4位数,就是上一趟运算结果的后四位数 字。注意到上述公式的结果是n/2,那么我们就把数组都初 始化为2,由于要一次输出4位,所以扩大10000倍。二、错误1、数组初始化for( ;b-c; ) fb+ =a/5;这一行代码把数组f0至f2799设置为2000, f2800没有初 始化,还是0,那么在实际运算中这一项是没有起到作用的, 由于这一项的结果实在太小了。但是从计算逻辑上,却有很 大的混淆作用,实际上f0是从来没有用到的,所以初始化 应该是把f1至f2800初

15、始化为2000,这样精度在小数点后 848位才出现变化,由于结果是精确到第844位,所以这点 精度实际上是没有意义的,但是算法却正确了。也就是 for( ;b-c; ) f+b =a/5;三、其他1、输出结果(printf)代码中的d就是每趟运算中商的累计,就是要输出的结果, 由公式及我们的算法处理可知,d不会超过8位,而且其左 4位与前次余数e的和也不会超过8位,所以我们用 printf(%.4d,e+d/10000)把左4位输出,把d的右4位保存在 e中e=d%10000。printf(%.4d,)输出4位整数,且显示最 左面的0,就是那个.的作用了。2、c的作用在第二个for循环中用c-=14来控制循环次数,实际上的影 响在于第三个for循环的初始化部分b=c,上面分析过这样的 处理(错误)对精度几乎没有影响。实际上c-=14没有特殊 的含义,只是因为2800/(800/4)=14,我们完全可以用计数器 来替代,就像我们的代码中一样。3、g的作用g就是公式中的2k+1,在我们的程序中完全可以用2*b+1来 替代。仅仅三行的代码完成了这么复杂的计算,让我佩服的同时也 感觉到了算法的精妙。希望以后还能继续学习算法的相关知识写出更多高质量的 代码。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号