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

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

其中有些计算起来很复杂, 我们可以选用第三个, 比较简单, 并且收敛的非常快。

因为计算π值, 而这个公式是计算π/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

{

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

{

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位整数, 其余都是小数位。

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

c语言 圆周率10000位,计算圆周率 Pi (π)值, 精确到小数点后 10000 位(C语言)相关推荐

  1. c语言计算pi后1000位,计算圆周率 Pi (π)值, 精确到小数点后 10000 位

    大家都知道π=3.1415926--无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题.现在有了电脑, 这个问题就简单了. 电脑可以利用级数计算出很多高精度的值, 有关级数的问题请 ...

  2. double值精确到小数点后两位

    double值精确到小数点后两位 功能 将程序中的double值精确到小数点后两位.可以四舍五入,也可以直接截断. 比如:输入12345.6789,输出可以是12345.68也可以是12345.67. ...

  3. c++输出的值精确到小数点后5位_c/c++linux 2019最新阿里研发类面试题及答案分享...

    问题点总结: 1.1.1 问题:如何实现一个高效的单向链表逆序输出? 1.1.2 题目:已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位. 1.1 ...

  4. c++输出的值精确到小数点后5位_C的探查之路05-基本类型

    整数类型 整数类型简称整型,也就是所谓的整数.int类型通常都是32位.但是有的程序需要的int很大,无法以int类型存储,所以C语言还提供了长整型,当然如果你需要一些小的空间存储,可以用短整型. 有 ...

  5. c++输出的值精确到小数点后5位_七年级上册第一章有理数专讲专练(适合暑期预习后巩固)...

    供同学们复习使用. 专题一 有理数的概念 一.典题剖析 例1 <九章算术>中注有"今两算得失相反,要令正负以名之",意思是:今有两数若其意义相反,则分别叫做正数与负数, ...

  6. python小数点后任意位_Python计算开方、立方、圆周率,精确到小数点后任意位的方法...

    Python计算的位数 在电脑上做了一个实验,看看python能计算到多少位,一下是结果. x = math.sqrt((3)) print ("%.53f"%(x)) print ...

  7. c语言两数相除等于小数多少,c语言知识程序两数相除精确到小数点后k位.doc

    c语言知识程序两数相除精确到小数点后k位.doc -题目 输入两个整数m和n,及另一正整数k,计算m/n,结果精确到小数点后k位1.问题分析与方案设计.1.首先解决输入问题.题目要求输入三个整数m,n ...

  8. c语言两数相除等于小数多少,c语言程序两数相除精确到小数点后k位

    题目: 输入两个整数m和n,及另一正整数k,计算m/n,结果精确到小数点后k位 1.问题分析与方案设计. 1.首先解决输入问题.题目要求输入三个整数m,n,k.所以定义input()函数,使输入的为正 ...

  9. 无穷分数 无穷的分数,有时会趋向于固定的数字。 请计算【图1.jpg】所示的无穷分数,要求四舍五入,精确到小数点后5位,小数位不足的补0。 请填写该浮点数,不能填写任何多余的内容。

    无穷分数 无穷的分数,有时会趋向于固定的数字. 请计算[图1.jpg]所示的无穷分数,要求四舍五入,精确到小数点后5位,小数位不足的补0. 请填写该浮点数,不能填写任何多余的内容. package s ...

  10. 无穷的分数,有时会趋向于固定的数字。 请计算【图1.jpg】所示的无穷分数,要求四舍五入,精确到小数点后5位,小数位不足的补0。 图1.jpg 请填写该浮点数,不能填写任何多余的内容。

    无穷的分数,有时会趋向于固定的数字. 请计算[图1.jpg]所示的无穷分数,要求四舍五入,精确到小数点后5位,小数位不足的补0. 图1.jpg 请填写该浮点数,不能填写任何多余的内容. public ...

最新文章

  1. UML类图、接口、包、关系
  2. C/C++ 宏定义中#、##、#@的区别
  3. 移动重定位表到新增节
  4. Implementing Synchronization Operations
  5. TCP 客户端和服务器端
  6. 多目标跟踪全解析,全网最全
  7. PAT-BASIC-1003-我要通过!
  8. 这才是智能家居真正的现状
  9. 最好的UI/UE设计资源网站推荐-免费的头像库
  10. mac safari 下载pdf
  11. 那些油管上高质量的学习编程的频道 之一
  12. 侏罗纪开发实施工作管理平台
  13. 【JAVA笔记】JAVA调用同一个包里的不同类的方法:
  14. 使用 Linux 文件恢复工具
  15. window创建l2tp
  16. 跳槽重回前公司?当初的离职原因没解决,早晚还得辞职
  17. 纽约州立大学水牛城分校计算机科学专业,纽约州立大学水牛城分校有哪些强势专业...
  18. JavaScript(三十七)——移动端、多媒体、CSS动画
  19. JAVA模板引擎velocity语法讲解
  20. 创业必须知道的----注册公司的流程和所需材料

热门文章

  1. 【2】使用MATLAB进行机器学习(回归)
  2. 华为电脑管家最新(11.1.1.95)版安装教程(适合 未安装| 补充说明)
  3. 协同过滤推荐算法概括总结
  4. catia设计树_CATIA目录树节点管理 | 坐倚北风
  5. 电容电感频率测量表 电路原理
  6. Hadoop面试题整理(1)
  7. XeLatex在window上编译较慢的解决方法
  8. 最新Oreo支付系统平台完整源码+已全开源
  9. 波司登杯2013微软office应用创意大赛烟台大学校园赛参赛历程
  10. C语言printf格式化输出