一些参考资料:
http://www.guokr.com/blog/444081/

大家都知道π=3.1415926……无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题。现在有了电脑计算机, 这个问题就简单了。

最简单高效用Python; mpmath库,

from mpmath import mp
mp.dps = 1000
print( mp.pi) ## 输出1000位圆周率

电脑可以利用级数计算出很多高精度的值, 有关级数的问题请参考《高等数学》,以下是比较有名的有关π的级数:

其中有些计算起来很复杂, 我们可以选用第三个, 比较简单, 并且收敛的非常快。
因为计算π值, 而这个公式是计算π/2的, 我们把它变形:
π = 2 + 2/3 + 2/3*2/5 + 2/3*2/5*3/7 + …
对于级数, 我们先做个简单测试, 暂时不要求精度:
用 C++ Builder 新建一个工程, 在 Form 上放一个 Memo1 和 一个 Button1, 在 Button1 的 OnClick 事件写:

void __fastcall TForm1::Button1Click(TObject *Sender)
{double x=2, z=2;int a=1, b=3;while(z>1e-15){z = z*a/b;x += z;a++;b+=2;}Memo1->Text = AnsiString().sprintf("Pi=%.13f", x);
}

按Button1在Memo1显示出执行结果:

Pi=3.1415926535898
这个程序太简单了, 而且 double 的精度很低, 只能计算到小数点后 10 几位。
把上面的程序改造一下, 让它精确到小数点后面 1000 位再测试一下:
在 Form 上再放一个按钮 Button2, 在这个按钮的 OnClick 事件写:

void __fastcall TForm1::Button2Click(TObject *Sender)
{const ARRSIZE=1010, DISPCNT=1000; //定义数组大小,显示位数char x[ARRSIZE], z[ARRSIZE]; //x[0] x[1] . x[2] x[3] x[4] .... x[ARRSIZE-1]int a=1, b=3, c, d, Run=1, Cnt=0;memset(x,0,ARRSIZE);memset(z,0,ARRSIZE);x[1] = 2;z[1] = 2;while(Run && (++Cnt<200000000)){//z*=a;d = 0;for(int i=ARRSIZE-1; i>0; i--){c = z[i]*a + d;z[i] = c % 10;d = c / 10;}//z/=b;d = 0;for(int i=0; i<ARRSIZE; i++){c = z[i]+d*10;z[i] = c / b;d = c % b;}//x+=z;Run = 0;for(int i=ARRSIZE-1; i>0; i--){c = x[i] + z[i];x[i] = c%10;x[i-1] += c/10;Run |= z[i];}a++;b+=2;}Memo1->Text = AnsiString().sprintf("计算了 %d 次\r\n",Cnt);Memo1->Text = Memo1->Text + AnsiString().sprintf("Pi=%d%d.\r\n", x[0],x[1]);for(int i=0; i<DISPCNT; i++){if(i && ((i%100)==0))Memo1->Text = Memo1->Text + "\r\n";Memo1->Text = Memo1->Text + (int)x[i+2];}
}

按 Button2 执行结果:
Pi=03.
1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
8214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196
4428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273
7245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094
3305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912
9833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132
0005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235
4201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859
5024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303
5982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989
这下心理有底了, 是不是改变数组大小就可以计算更多位数呢?答案是肯定的。
如果把定义数组大小和显示位数改为:

const ARRSIZE=10100, DISPCNT=10000; //定义数组大小,显示位数

执行结果精度可达 10000 位:

Pi=03.
1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
8214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196
4428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273
7245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094
3305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912
9833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132
0005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235
4201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859
5024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303
5982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989
3809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151

… 限于篇幅, 这里就省略了, 还是留给你自己来算吧!

5020141020672358502007245225632651341055924019027421624843914035998953539459094407046912091409387001
2645600162374288021092764579310657922955249887275846101264836999892256959688159205600101655256375678
提高精度的原理:

以上程序的原理是利用数组把计算结果保存起来, 其中数组每一项保存10进制数的一位,
小数点定位在数组第1个数和第二个数之间, 即小数点前面2位整数, 其余都是小数位。

利用电脑模拟四则运算的笔算方法来实现高精度的数据计算,没想到最原始的方法竟然是精度最高的。

/某年Obfuscated C Contest佳作选录: 800位精度圆周率/

#include < stdio.h>
long a=10000, b, c=2800, d, e, f[2801], g;
main(){
for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
} 

将以上精简的程序详细include_stdioint

a=10000,b,c=2800,d,e,f[2801],g;
main() {
int i;
e=0;
for(i=0;i<c;i++)f[i]=a/5;
while(c!=0){d=0;g=c*2;b=c;while(1){d=d+f[b]*a;g--;f[b]=d%g;d=d/g;g--;b--;if(b==0) break;d=d*b;}c=c-14;printf("%.4d",e+d/a);e=d%a;}
}

//根据这个思想,我们可以轻易的算出 自然对数底 e=2.71828….的任意位数
//e=1+1/1!+1/2!+1/3!+…………+1/n!=1+1/2*(1+1/3*(1+……*(1+1/n))..)));

int main(int argc,char* argv[])
{
#define TIMES 100 ///输出e有效位数
int n,c,e,d,i,f[TIMES+1];
i=TIMES;
while(i--){f[i]=10;
}printf("e=2.");
i=0;
e=0;
while(i++<TIMES)
{
d=0;
c=TIMES;
for(n=c;n>0;n--){d=d+f[n]*10;f[n]=d%n;///////余数d=d/(n);//////整数} printf("%d",(e+d/10)%10);e=d%10;
}
getchar();
return 0;
}

程序计算精确圆周率Pai的方法相关推荐

  1. python计算圆周率近似值_python计算圆周率pi的方法

    本文实例讲述了python计算圆周率pi的方法.分享给大家供大家参考.具体如下: from sys import stdout scale = 10000 maxarr = 2800 arrinit ...

  2. c语言编程快速收敛的圆周率计算,[原创]圆周率PI的计算(精确到几十万位)

    [原创]圆周率PI的计算(精确到几十万位) //环境:VC6.0,Console Application //原理:π=2+1/3*(2+2/5*(2+3/7*(2+... //特点:内嵌汇编提速并扩 ...

  3. 方法重载例题 编写程序计算两个同类型的数之和 Java

    方法的重载: 方法重载是指在同一作用域内,可以有一组具有相同方法名,不同参数表,返回值类型可以相同也可以不同的方法.重载方法通常用来命名一组功能相似的方法,这样做减少了方法名的数量,提高程序的可读性和 ...

  4. 编制程序完成下述任务:接受两个数,一个为用 户一年期定期存款金额,一个为按照百分比格式表示的利率;程序计算一年期满后本金与利息总额。说明:(1)存款金额以人民币元为单位,可能精确到分; (2)输入利率

    编制程序完成下述任务:接受两个数,一个为用 户一年期定期存款金额,一个为按照百分比格式表示的利率:程序计算一年期满后本金与利息总额.说明:(1)存款金额以人民币元为单位,可能精确到分: (2)输入利率 ...

  5. 圆周率java程序_Java小程序计算圆周率代码

    下面我们来介绍两种Java编程中实现计算圆周率的方法. 方法一:割圆法 计算公式为: π≈3*2^n*y_n 其中,n代表割圆次数,y_n代表圆中内嵌正6*n边形的边长 package 计算π的近似值 ...

  6. fft 估计载波频率程序_一种基于扫描精确估计载波频率的方法与流程

    本发明涉及信号处理技术领域,特别涉及一种基于扫描精确估计载波频率的方法. 背景技术: 信号的载波频率估计是通信.雷达.声纳以及电子对抗等领域信号处理中的一个重要问题.基于参数模型的谱估计.最大熵谱估计 ...

  7. 编写一个C++风格的程序,用动态分配空间的方法计算Fibonacci数列的前20项并存储到动态分配的空间中

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 编写一个C++风格的程序,用动态分配空间的方法计算Fibonacci数列的前20项并存储到动态分配的空间中. 代码: #inc ...

  8. python计算圆周率近似值_怎样利用python来计算出圆周率π-百度经验

    怎样利用python来计算出圆周率π? 方法/步骤 1 圆周率π是一个无理数,没有任何一个精确公式可以计算出π值,π的计算只能采用近似算法. 我们利用蒙特卡洛方法来求得π的近似值. 蒙特卡洛方法是利用 ...

  9. bool转nsnumber ios_iOS开发之NSDecimalNumber的使用,货币计算/精确数值计算/保留位数等...

    iOS开发NSDecimalNumber的使用,货币计算/精确数值计算/保留位数等 NSDecimalNumber NSDecimalNumber,不可变NSNumber 的子类,提供了一个面向对象的 ...

最新文章

  1. POJ 1185 炮兵阵地 (状压DP)
  2. A - Expanding Rods POJ - 1905(二分)
  3. [Swift]LeetCode45. 跳跃游戏 II | Jump Game II
  4. linux cp 覆盖不确认,cp命令强制覆盖,不提示确认信息
  5. 布线技术不断演进满足快速增长的网络需求
  6. 数据中心运营:内包还是外包?
  7. matlab中文本文件与图像转化
  8. Effective Java之静态工厂代替构造器(一)
  9. 一份北大信科内部流传的 “CS 自救指南”
  10. RK3399Pro Android Rock-X 人工智能开发系列(1)
  11. L3-019 代码排版 (30 分)-PAT 团体程序设计天梯赛 GPLT
  12. Qt 多界面来回切换的问题以及Qt界面关闭与销毁
  13. 第一次大作业总结——四则运算程序
  14. java 将汉字编码_JAVA中的汉字编码问题
  15. FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比
  16. Mac Os 安装配置Maven以及IntelliJ IDEA Maven使用
  17. 经纬度(度分秒)和十进制相互转换
  18. 肠道微生物组如何影响运动能力,所谓的“精英肠道微生物组”真的存在吗?
  19. 【牛客】新建 Microsoft Office Word 文档题解
  20. python角谷猜想递归实现_第三周函数的递归---编程作业: 递归编程练习

热门文章

  1. python+find_all函数_BeautifulSoup库之find_all函数
  2. linux预留的系统调用号,Linux的系统调用号列表
  3. 转:Vim实战指南(二):光标移动技巧
  4. Azure CosmosDB (13) CosmosDB数据建模
  5. TP-LINK如何防止被蹭网?
  6. xutils 使用规则以及所实现的功能
  7. 问答系统技术--DeepQA
  8. 教育家教O2O平台-产品与方案-博雅互联EagleClouds
  9. 分享88个ASP.NET企业网站源码,总有一款适合您
  10. 可怜之人必有可恨之处!!!