计算圆周率 Pi (π)值, 精确到小数点后 10000 位

转载 2004年07月12日 10:04:00

[推荐]计算圆周率 Pi (π)值, 精确到小数点后 10000 位
精确到小数点后面 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位整数, 其余都是小数位。

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

并行计算MPI(三):计算π

学习了之前的一些并行计算MPI基本知识之后,其实可以尝试应用起来,今天这篇文章就是用并行计算求解π的。首先需要知道π的求解方式:          上面是高等数学里的基本知识,所以π的求解就可以变...
  • sj_lxd
  • sj_lxd
  • 2015年03月11日 13:54
  • 2620

OpenMP之数值积分(求圆周率Pi)(sections)

// Pi.cpp : 定义控制台应用程序的入口点。 //求圆周率PI #include "stdafx.h" #include #include #include #include usi...
  • he_xiang_
  • he_xiang_
  • 2014年09月24日 11:16
  • 1456

用hadoop计算PI值

摘要:最近研究hadoop的一个例子,计算PI值,本以为hadoop不适合这种密集型的计算,却发现了在hadoop自带的examples里,竟然有PiEstimator这个例子,于是深入研究一下,首先...
  • minglaihan
  • minglaihan
  • 2014年08月30日 10:19
  • 2400

计算圆周率 Pi (π)值, 精确到小数点后 10000 位 只需要 30 多句代码!

原文地址http://www.cppfans.com/articles/basecalc/c_pi_10000.asp by: Victor Chen 大家都知道π=3.1415926……无穷多位, ...
  • heyzol
  • heyzol
  • 2013年11月06日 21:44
  • 1137

python R 实现蒙特卡洛算法计算pi值

python R 两种语言实现蒙特卡洛算法计算pi值。
  • neweastsun
  • neweastsun
  • 2016年07月01日 11:57
  • 2967

【MFC】多线程计算圆周率π的值

简单的mfc中利用多线程逐步输出pi的值(800位),可以中途暂停和继续,顺便做了下界面和图标。...
  • sickbaimu
  • sickbaimu
  • 2017年06月14日 23:21
  • 316

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

一、需求分析 输入想要计算到小数点后的位数,计算圆周率π的值。二、算法:马青公式π/4=4arctan1/5-arctan1/239这个公式由英国天文学教授约翰·马青于1706年发现。他利用这个公式...
  • u013421629
  • u013421629
  • 2017年05月23日 15:15
  • 7342

用随机投点法计算PI值

#include "iostream" #include "ctime" #include "iomanip"using namespace std;const unsigned long maxsh...
  • u012319493
  • u012319493
  • 2015年12月11日 13:16
  • 1847

计算任意位数的Pi

当用程序实现求pi的值时,也许你能够很快写出算法(利用求pi的几个公式),但是由于使用单变量保存结果,限于计算机硬件对变量的表示范围有限,因此,最多只能计算出pi值小数点后十多位。但需要得到一个更大位...
  • u012027907
  • u012027907
  • 2013年10月08日 01:47
  • 3853

并行计算圆周率

看到这个题目,俗了,大家都在计算圆周率。不过咱们的目的是看一下并行计算的基本流程。 书上计算PI用的是精确的数值计算方法,我这里再给出一种概率计算方法。 OpenMP和MPI将同时亮相。 计算P...
  • judyge
  • judyge
  • 2015年05月30日 11:43
  • 706
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算圆周率 Pi (π)值, 精确到小数点后 10000 位
举报原因:
原因补充:

(最多只允许输入30个字)