大家都知道π=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位整数, 其余都是小数位。

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

计算圆周率 Pi (π)值相关推荐

  1. [Julia语言]使用Chudnovsky 算法快速计算圆周率 Pi (π) 值

    测试用的电脑是一台10年老电脑,CPU型号:E3 1230V2,3.3GHZ,4核8线程,8GB内存. 用下面的Julia程序,计算1万位的Pi值,耗时为0.26秒. 作为比较,用Julia实现的另一 ...

  2. [JuliaDelphi]快速计算圆周率 Pi (π) 值

    算法参考自: 计算圆周率Pi(π)值,精确到小数点后10000位 - 圆周率10000位 - C++ 爱好者 分别以Julia 1.72和Delphi 10.3写的算法如下面所示.在一台10年的老电脑 ...

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

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

  4. 用python计算圆周率_用python计算圆周率PI

    一.计算圆周率PI的方法 (一)公式法: 1 #CalPiV1.py 2 pi =03 N = 100 4 for k inrange(N):5 pi += 1/pow(16, k) * (4 / ( ...

  5. c语言用for或while计算,C语言趣味编程:使用while循环结构计算圆周率pi

    循环结构是编程语言中的一种基本程序结构,C语言中有两种表示方法,分别可通过for循环和while循环结构实现.上篇文章已经讲了for循环的使用方法,详细请参考: 这次通过一个计算圆周率pi的例子给大家 ...

  6. 【python圆周率计算】python计算圆周率π的值到任意位

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程.人工智能教程 一.需求分析 输入 ...

  7. python计算圆周率_Python实现计算圆周率π的值到任意位的方法示例

    本文实例讲述了Python实现计算圆周率π的值到任意位的方法.分享给大家供大家参考,具体如下: 一.需求分析 输入想要计算到小数点后的位数,计算圆周率π的值. 二.算法:马青公式 π/4=4arcta ...

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

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

  9. C语言通过傅里叶展开式计算圆周率PI的代码

    把做工程过程比较重要的一些代码段记录起来,下面的代码是关于C语言通过傅里叶展开式计算圆周率PI的代码. #include #include <math.h> using namespace ...

最新文章

  1. Android开发教程 - 使用Data Binding(二)集成与配置
  2. opencv + python3 利用ros 的 cv_bridge 传送图像消息的一种替代方法
  3. input驱动12种事件类型Event types的含义
  4. 大型“数码管”解决方案:用了 28 个舵机的时钟,到底有什么特别?
  5. html日期写入数据库,javascript – 在HTML5 Web SQL数据库中对日期时间进行排序
  6. Rtx 实时通知实现
  7. python数据结构之字典(未完成)
  8. Navicat 远程连接ubuntu出现的问题
  9. python一个月能掌握吗_Python 从入门到精通:一个月足够了!
  10. 【原创】设计模式面对面之观察者模式
  11. 上位机与下位机的串口通信实践
  12. 【编译原理总结】由正则式构造等价的DFA并将其最小化
  13. vue开发移动端app-学习记录
  14. scanf 详解 - 你所不知道的scanf用法
  15. 使用pytorch实现LSTM自动AI作诗(藏头诗和首句续写)
  16. 深入理解Apache NIFI Run Duration
  17. 智能小区安防子系统实现
  18. 电动晾衣架的优点都有哪些?是否适合家庭选择?
  19. Unity大量人物模型,及输出FBX功能。
  20. [Javascript 高级程序设计]学习心得记录 函数参数传递与引用

热门文章

  1. 微信公众号添加关注后自动回复图文信息(素材)
  2. 标志寄存器(FLAGS,PSW,FR)简介
  3. 转换通达信分钟数据,包括5分钟和1分钟数据
  4. Linux的安装教程
  5. 无法停止“通用卷”设备的解决方法
  6. 【图像相关】图像质量评价指标 PSNR 和 SSIM
  7. 创意英文字体下载_电子游戏中字体的18种创意用途
  8. 金蝶云星空单据转换设置
  9. Kaggle泰坦尼克号之灾
  10. 泺水机器人吕梁店_一处清泉一座城,泺水之源自风流