昌平五中初一九班吧 关注:7贴子:251

圆周率的计算方法

只看楼主收藏回复

古人计算圆周率,一般是用割圆法。即用圆的内接或外切正多边形来逼近圆的周长。Archimedes用正96边形得到圆周率小数点后3位的精度;刘徽用正3072边形得到5位精度;Ludolph Van Ceulen用正262边形得到了35位精度。这种基于几何的算法计算量大,速度慢,吃力不讨好。随着数学的发展,数学家们在进行数学研究时有意无意地发现了许多计算圆周率的公式。下面挑选一些经典的常用公式加以介绍。除了这些经典公式外,还有很多其他公式和由这些经典公式衍生出来的公式,就不一一列举了。



1楼2007-12-08 17:59回复
    Machin公式


    2楼2007-12-08 18:00
    回复
      广告
      立即查看
      .


      3楼2007-12-08 18:00
      回复
        这个公式由英国天文学教授John Machin于1706年发现。他利用这个公式计算到了100位的圆周率。Machin公式每计算一项可以得到1.4位的十进制精度。因为它的计算过程中被乘数和被除数都不大于长整数,所以可以很容易地在计算机上编程实现


        4楼2007-12-08 18:01
        回复
          printf("Working ......\n");
           printf("Press 'p' to pause & exit\n");
           time(&time1);
           if (Step == 0) {
           x = 5;
           FirstDiv(arctg5);
           x = x * x;
           n = 3;
           sign = -1;
           NonZeroPtr = 1;
           arctgx(arctg5);
           }
           else if (Step == 1) {
           x = 5 * 5;
           arctgx(arctg5);
           }
           if (Step == 0 || Step == 1) {
           x = 239;
           FirstDiv(arctg239);
           x = x * x;
           n = 3;
           sign = -1;
           NonZeroPtr = 1;
           arctgx(arctg239);
           }
           else {
           x = 239 * 239;
           arctgx(arctg239);
           }
           mul_array(arctg5, 16);
           mul_array(arctg239, 4);
           sub2array(arctg5, arctg239);
           if ((pi=fopen("pi.txt","wt"))==NULL) {
           printf("Create file pi.txt error!!\n");
           exit(0);
           }
           printf("Writing result to file: pi.txt ...\n");
           fprintf(pi, "%d", arctg5[0]);
           for (i=1; i<=DecLen/9; i++) {
           arctg5[0] = 0;
           mul_array(arctg5, 1000000000);
           fprintf(pi, "%09d", arctg5[0]);
           }
           tail = DecLen % 9;
           p10tail = 1;
           for (i=1;i<=tail;i++) p10tail *= 10;
           arctg5[0] = 0;
           mul_array(arctg5, p10tail);
           fprintf(pi, "%0*d", tail, arctg5[0]);
           fclose(pi);
           time(&time2);
           TotalTime += time2 - time1;
           printf("Done !!\n");
           ts = gmtime(&TotalTime);
           ts->tm_mon --;
           ts->tm_mday = ts->tm_mday - 1 + ts->tm_mon * 31;
           printf("Time : ");
           if (ts->tm_mday > 0) printf("%d Day(s) ", ts->tm_mday);
           printf("%02d:%02d:%02d\n", ts->tm_hour, ts->tm_min, ts->tm_sec);
           if (_unlink(fn_status) == 0) {
           _unlink(fn_arctg5);
           _unlink(fn_arctg239);
           _unlink(fn_tmp);
           }
          }


          7楼2007-12-08 18:02
          回复
            Ramanujan公式


            9楼2007-12-08 18:03
            回复
              这个公式被称为Chudnovsky公式,每计算一项可以得到15位的十进制精度。1994年Chudnovsky兄弟利用这个公式计算到了4,044,000,000位。Chudnovsky公式的另一个更方便于计算机编程的形式是


              11楼2007-12-08 18:04
              回复
                AGM(Arithmetic-Geometric Mean)算法 
                 Gauss-Legendre公式


                12楼2007-12-08 18:05
                回复
                  广告
                  立即查看
                  初值:


                  13楼2007-12-08 18:05
                  回复
                    重复计算


                    14楼2007-12-08 18:06
                    回复
                      最后计算:


                      15楼2007-12-08 18:06
                      回复
                        这个公式每迭代一次将得到双倍的十进制精度,比如要计算100万位,迭代20次就够了。1999年9月Takahashi和Kanada用这个算法计算到了圆周率的206,158,430,000位,创出新的世界纪录


                        16楼2007-12-08 18:07
                        回复
                          Borwein四次迭代式:


                          17楼2007-12-08 18:07
                          回复
                            初值:


                            18楼2007-12-08 18:09
                            回复
                              广告
                              立即查看
                              重复计算


                              20楼2007-12-08 18:10
                              回复