计算圆周率Pi (π)值, 精确到小数点后10000 位
只需要30 多句代码!
(浏览77154 次)
Victor Chen, (C++ 爱好者)
大家都知道π=3.1415926……无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题。
现在有了电脑, 这个问题就简单了。
电脑可以利用级数计算出很多高精度的值, 有关级数的问题请参考《高等数学》,以下是比较有名的有关π的级数:
其中有些计算起来很复杂, 我们可以选用第三个, 比较简单, 并且收敛的非常快。
因为计算π值, 而这个公式是计算π/2的, 我们把它变形:
π = 2 + 2/3 + 2/3*2/5 + 2/3*2/5*3/7 + ...
对于级数, 我们先做个简单测试, 暂时不要求精度:
用C++ Builder 新建一个工程, 在Form 上放一个Memo1 和一个Button1, 在Button1 的OnClick 事件写:
按Button1在Memo1显示出执行结果:
Pi=3.1415926535898
这个程序太简单了, 而且double 的精度很低, 只能计算到小数点后10 几位。
把上面的程序改造一下, 让它精确到小数点后面1000 位再测试一下:
在Form 上再放一个按钮Button2, 在这个按钮的OnClick 事件写:
按Button2 执行结果:
Pi=03. 14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534 21170679 82148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954 93038196 44288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602 49141273 72458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194 15116094 33057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183 01194912 98336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676 69405132 00056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968 92589235 42019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816 09631859 50244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776 69147303
59825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921 64201989
这下心理有底了, 是不是改变数组大小就可以计算更多位数呢?答案是肯定的。
如果把定义数组大小和显示位数改为:
const ARRSIZE=10100, DISPCNT=10000; //定义数组大小,显示位数
执行结果精度可达10000 位:
Pi=03. 14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534 21170679 82148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954 93038196 44288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602 49141273 72458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194 15116094 33057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183 01194912 98336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676 69405132 00056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968 92589235 42019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816 09631859 50244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776 69147303 59825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921 64201989 38095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283 47913151
... 限于篇幅, 这里就省略了, 还是留给你自己来算吧!
50201410206723585020072452256326513410559240190274216248439140359989535394590944070469120914 09387001 26456001623742880210927645793106579229552498872758461012648369998922569596881592056001016552 56375678
提高精度的原理:
以上程序的原理是利用数组把计算结果保存起来, 其中数组每一项保存10进制数的一位,
小数点定位在数组第1个数和第二个数之间, 即小数点前面2位整数, 其余都是小数位。
利用电脑模拟四则运算的笔算方法来实现高精度的数据计算,没想到最原始的方法竟然是精度最高的。