计算圆周率Pi(π)值,精确到小数点后10000位
计算圆周率i()值,精确到小数点后10000位只需要30多句代码!(浏览77154次)VictorChen,(C+爱好者)大家都知道=314152无穷多位,历史上很多人都在计算这个数,一直认为是一个非常复杂的问题。现在有了电脑,这个问题就简单了。电脑可以利用级数计算出很多高精度的值,有关级数的问题请参考高等数学,以下是比较有名的有关的级数:7T224466=XXXXXX21335577Td11212323353577Fd1111=1+.435797F1111x31+x+6223x252x45x2J旁=1+界+歹+尹+其中有些计算起来很复杂,我们可以选用第三个,比较简单,并且收敛的非常快。因为计算值,而这个公式是计算/2的,我们把它变形:=2+2/3+2/3*2/5+2/3*2/5*3/7+对于级数,我们先做个简单测试,暂时不要求精度:用C+Builder新建一个工程,在Form上放一个Memo1和一个Button1,在Button1的OnClick事件写:void_fastcallTForm1:Button1Click(TObject*Sender)doublex=2,z=2;inta=1,b=3;while(z>1e-15)z=z*a/b;x+=z;a+;按Button1在Memo1显示出执行结果:Pi=3.1415926535898这个程序太简单了,而且double的精度很低,只能计算到小数点后10几位。把上面的程序改造一下,让它精确到小数点后面1000位再测试一下:在Form上再放一个按钮Button2,在这个按钮的OnClick事件写:void_fastcallTForml:Button2Click(TObject*Sender)constARRSIZE=1010,DISPCNT=1000;/定义数组大小,显示位数charxARRSIZE,zARRSIZE;x0x1.x2x3x4.xARRSIZE-1inta=1,b=3,c,d,Run=1,Cnt=0;memset(x,0,ARRSIZE);memset(z,O,ARRSIZE);x1=2;z1=2;while(Run&&(+Cnt<200000000)/z*=a;d=0;for(inti=ARRSIZE-1;i>0;i-)c=zi*a+d;zi=c%10;d=c/10;/z/=b;d=0;for(inti=0;i<ARRSIZE;i+)c=zi+d*10;zi=c/b;d=c%b;按Button2执行结果:Pi=03.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989这下心理有底了,是不是改变数组大小就可以计算更多位数呢?答案是肯定的。如果把定义数组大小和显示位数改为:constARRSIZE=10100,DISPCNT=10000;/定义数组大小,显示位数执行结果精度可达10000位:Pi=03.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151.限于篇幅,这里就省略了,还是留给你自己来算吧!50201410206723585020072452256326513410559240190274216248439140359989535394590944070469120914093870012645600162374288021092764579310657922955249887275846101264836999892256959688159205600101655256375678提高精度的原理:以上程序的原理是利用数组把计算结果保存起来,其中数组每一项保存10进制数的一位,小数点定位在数组第1个数和第二个数之间,即小数点前面2位整数,其余都是小数位。利用电脑模拟四则运算的笔算方法来实现高精度的数据计算,没想到最原始的方法竟然是精度最高的167975678246.8+63889莖95/1234=806867210632354204534=511023040算法原理4U