阿基米德求圆周率的更精确近似值的方法,体现在他的一篇论文《圆的测定》之中。
在这一书中,阿基米德第一次创用上、下界来确定 π 的近似值,他用几何方法证明了“圆周长与圆直径之比小于 3+(1/7) 而大于 3 + (10/71) ”,他还提供了误差的估计。重要的是,这种方法从理论上而言,能够求得圆周率的更准确的值。
到公元150年左右,希腊天文学家托勒密得出 π =3.1416,取得了自阿基米德以来的巨大进步。 圆周率是一个极其驰名的数。
从有文字记载的历史开始,这个数就引进了外行人和学者们的兴趣。作为一个非常重要的常数,圆周率最早是出于解决有关圆的计算问题。
仅凭这一点,求出它的尽量准确的近似值,就是一个极其迫切的问题了。事实也是如此,几千年来作为数学家们的奋斗目标,古今中外一代一代的数学家为此献出了自己的智慧和劳动。
回顾历史,人类对 π 的认识过程,反映了数学和计算技术发展情形的一个侧面。 π 的研究,在一定程度上反映这个地区或时代的数学水平。
德国数学史家康托说:“历史上一个国家所算得的圆周率的准确程度,可以作为衡量这个国家当时数学发展水平的指标。”直到19世纪初,求圆周率的值应该说是数学中的头号难题。
为求得圆周率的值,人类走过了漫长而曲折的道路,它的历史是饶有趣味的。我们可以将这一计算历程分为几个阶段。
圆周率是指平面上圆的周长与直径之比 (ratio of the circumference of a circle to the diameter) 。
用符号π(读音:pài)表示。中国古代有圆率、周率、周等名称。
(在一般计算时π=3.14) 圆周率的历史 古希腊欧几里得《几何原本》(约公元前3世纪初)中提到圆周率是常数,中国古算书《周髀算经》( 约公元前2世纪)中有“径一而周三”的记载,也认为圆周率是常数。历史上曾采用过圆周率的多种近似值,早期大都是通过实验而得到的结果,如古埃及纸草书(约公元前1700)中取π=(4/3)^4≈3.1604 。
第一个用科学方法寻求圆周率数值的人是阿基米德,他在《圆的度量》(公元前3世纪)中用圆内接和外切正多边形的周长确定圆周长的上下界,从正六边形开始,逐次加倍计算到正96边形,得到(3+(10/71))<π<(3+(1/7)) ,开创了圆周率计算的几何方法(亦称古典方法,或阿基米德方法),得出精确到小数点后两位的π值。中国数学家刘徽在注释《九章算术》(263年)时只用圆内接正多边形就求得π的近似值,也得出精确到两位小数的π值,他的方法被后人称为割圆术。
他用割圆术一直算到圆内接正192边形。南北朝时代数学家祖冲之进一步得出精确到小数点后7位的π值(约5世纪下半叶),给出不足近似值3.1415926和过剩近似值3.1415927,还得到两个近似分数值,密率355/113和约率22/7。
其中的密率在西方直到1573才由德国人奥托得到,1625年发表于荷兰工程师安托尼斯的著作中,欧洲称之为安托尼斯率。阿拉伯数学家卡西在15世纪初求得圆周率17位精确小数值,打破祖冲之保持近千年的纪录。
德国数学家柯伦于1596年将π值算到20位小数值,后投入毕生精力,于1610年算到小数后35位数,该数值被用他的名字称为鲁道夫数。 1579年法国数学家韦达给出π的第一个解析表达式。
此后,无穷乘积式、无穷连分数、无穷级数等各种π值表达式纷纷出现,π值计算精度也迅速增加。1706年英国数学家梅钦计算π值突破100位小数大关。
1873 年另一位英国数学家尚可斯将π值计算到小数点后707位,可惜他的结果从528位起是错的。到1948年英国的弗格森和美国的伦奇共同发表了π的808位小数值,成为人工计算圆周率值的最高纪录。
电子计算机的出现使π值计算有了突飞猛进的发展。1949年美国马里兰州阿伯丁的军队弹道研究实验室首次用计算机(ENIAC)计算π值,一下子就算到2037位小数,突破了千位数。
1989年美国哥伦比亚大学研究人员用克雷-2型和IBM-VF型巨型电子计算机计算出π值小数点后4.8亿位数,后又继续算到小数点后10.1亿位数,创下新的纪录。除π的数值计算外,它的性质探讨也吸引了众多数学家。
1761年瑞士数学家兰伯特第一个证明π是无理数。1794年法国数学家勒让德又证明了π2也是无理数。
到1882年德国数学家林德曼首次证明了π是超越数,由此否定了困惑人们两千多年的「化圆为方」尺规作图问题。还有人对π的特征及与其它数字的联系进行研究。
如1929年苏联数学家格尔丰德证明了eπ 是超越数等等。圆周率的计算 古今中外,许多人致力于圆周率的研究与计算。
为了计算出圆周率的越来越好的近似值,一代代的数学家为这个神秘的数贡献了无数的时间与心血。十九世纪前,圆周率的计算进展相当缓慢,十九世纪后,计算圆周率的世界纪录频频创新。
整个十九世纪,可以说是圆周率的手工计算量最大的世纪。进入二十世纪,随着计算机的发明,圆周率的计算有了突飞猛进。
借助于超级计算机,人们已经得到了圆周率的2061亿位精度。历史上最马拉松式的计算,其一是德国的Ludolph Van Ceulen,他几乎耗尽了一生的时间,计算到圆的内接正262边形,于1609年得到了圆周率的35位精度值,以至于圆周率在德国被称为Ludolph数;其二是英国的William Shanks,他耗费了15年的光阴,在1874年算出了圆周率的小数点后707位。
可惜,后人发现,他从第528位开始就算错了。把圆周率的数值算得这么精确,实际意义并不大。
现代科技领域使用的圆周率值,有十几位已经足够了。如果用Ludolph Van Ceulen算出的35位精度的圆周率值,来计算一个能把太阳系包起来的一个圆的周长,误差还不到质子直径的百万分之一。
以前的人计算圆周率,是要探究圆周率是否循环小数。自从1761年Lambert证明了圆周率是无理数,1882年Lindemann证明了圆周率是超越数后,圆周率的神秘面纱就被揭开了。
现在的人计算圆周率, 多数是为了验证计算机的计算能力,还有,就是为了兴趣。圆周率的计算方法 古人计算圆周率,一般是用割圆法。
即用圆的内接或外切正多边形来逼近圆的周长。Archimedes用正96边形得到圆周率小数点后3位的精度;刘徽用正3072边形得到5位精度;Ludolph Van Ceulen用正262边形得到了35位精度。
这种基于几何的算法计算量大,速度慢,吃力不讨好。随着数学的发展,数学家们在进行数学研究时有意无意地发现了许多计算圆周率的公式。
下面挑选一些经典的常用公式加以介绍。除了这些经典公式外,还有很多其它公式和由这些经典公式衍生出来的公式,就不一一列举了。
1、Machin公式 [这个公式由英国天文学教授John 。
圆周率的发展史
在历史上,有不少数学家都对圆周率作出过研究,当中著名的有阿基米德(Archimedes of Syracuse)、托勒密(Claudius Ptolemy)、张衡、祖冲之等。他们在自己的国家用各自的方法,辛辛苦苦地去计算圆周率的值。下面,就是世上各个地方对圆周率的研究成果。
亚洲
中国:
魏晋时,刘徽曾用使正多边形的边数逐渐增加去逼近圆周的方法(即「割圆术」),求得π的近似值3.1416。
汉朝时,张衡得出π的平方除以16等於5/8,即π等於10的开方(约为3.162)。虽然这个值不太准确,但它简单易理解,所以也在亚洲风行了一阵。
王蕃(229-267)发现了另一个圆周率值,这就是3.156,但没有人知道他是如何求出来的。
公元5世纪,祖冲之和他的儿子以正24576边形,求出圆周率约为355/113,和真正的值相比,误差小於八亿分之一。这个纪录在一千年后才给打破。
印度:
约在公元530年,数学大师阿耶波多利用384边形的周长,算出圆周率约为√9.8684。
婆罗门笈多采用另一套方法,推论出圆周率等於10的平方根。
欧洲
斐波那契算出圆周率约为3.1418。
韦达用阿基米德的方法,算出3.1415926535<;π<3.1415926537
他还是第一个以无限乘积叙述圆周率的人。
鲁道夫万科伦以边数多过32000000000的多边形算出有35个小数位的圆周率。
华理斯在1655年求出一道公式π/2=2*2*4*4*6*6*8*8。../3*3*5*5*7*7*9*9。。
欧拉发现的 e的iπ次方加1等於0,成为证明π是超越数的重要依据。
之后,不断有人给出反正切公式或无穷级数来计算π,在这里就不多说了。
由于祖冲之所著的数学专著《缀术》已经失传,《隋书》又没有具体地记载他求圆周率的方法,因此,我国研究祖国数学遗产的专家们,对于他求圆周率的方法还有不同的见解。
有人认为祖冲之圆周率中的“朒数”。是用作圆的内接正多边形的方法求得的;而“盈数”则是用作圆的外切正多边形的方法求得的。祖冲之如果继续用刘徽的办法,从圆的内接正六边形算起,逐次加倍边数,一直算到内接正24576边形时,它的各边长度总和只能逐次接近并较小于圆周的周长,这正多边形的面积也只能逐次接近并较小于圆面积,从此求出的圆周率为3.14159261,也只能小于圆周率的真实数值,这就是朒 数。从祖冲之的数学水平来看,突破刘徽的方法,从外切正六边形算起,逐次试求圆周率,也是可能的。如果祖冲之把外切正六边形的边数成倍增加,到正24576边形时,他所求得的圆周率应该是3.14159270208。这个数是用外切方法求得的。由于外切正多边形各边边长的总和永远大于圆周的长度,这正多边形的面积也永远大于圆面积,所以这个数总比真实的圆周率大。用四舍五入法舍去小数点七位以后的数字,就得出盈数。
祖冲之究竟是否同时用过内接和外切这两个方法求出圆周率的朒数和盈数,是没有确切史料可以证实的。但是采用这个办法所求出的朒、盈两个数值,和祖冲之原来所求出的结果大体是一致的。所以有些数学史家认为祖冲之曾用过作圆的外切正多边形的方法求得圆周率,是很近情理的推想。
但是根据另一些数学史家的研究,盈、朒两数也可以由计算圆内接正12288边形和正24576边形的边长而得出来。不过这种计算比较难懂,这里不说了。
尽管说法有出入,但是祖冲之曾经求得“密率”,并且明确地用上、下两限来说明圆周率这个数值的范围,是可以肯定的。在一千五百年前,他有这样的成就和认识,真值得我们钦佩。
在推算圆周率时,祖冲之付出了不知多少辛勤的劳动。如果从正六边形算起,算到24576边时,就要把同一运算程序反复进行十二次,而且每一运算程序又包括加减乘除和开方等十多个步骤。我们现在用纸笔算盘来进行这样的计算,也是极其吃力的。当时祖冲之进行这样繁难的计算,只能用筹码(小竹棍)来逐步推演。如果头脑不是十分冷静精细,没有坚韧不拔的毅力,是绝对不会成功的。祖冲之顽强刻苦的研究精神,是很值得推崇的。
由于祖冲之所著的数学专著《缀术》已经失传,《隋书》又没有具体地记载他求圆周率的方法,因此,我国研究祖国数学遗产的专家们,对于他求圆周率的方法还有不同的见解.有人认为祖冲之圆周率中的“朒数”.是用作圆的内接正多边形的方法求得的;而“盈数”则是用作圆的外切正多边形的方法求得的.祖冲之如果继续用刘徽的办法,从圆的内接正六边形算起,逐次加倍边数,一直算到内接正24576边形时,它的各边长度总和只能逐次接近并较小于圆周的周长,这正多边形的面积也只能逐次接近并较小于圆面积,从此求出的圆周率为3.14159261,也只能小于圆周率的真实数值,这就是朒 数.从祖冲之的数学水平来看,突破刘徽的方法,从外切正六边形算起,逐次试求圆周率,也是可能的.如果祖冲之把外切正六边形的边数成倍增加,到正24576边形时,他所求得的圆周率应该是3.14159270208.这个数是用外切方法求得的.由于外切正多边形各边边长的总和永远大于圆周的长度,这正多边形的面积也永远大于圆面积,所以这个数总比真实的圆周率大.用四舍五入法舍去小数点七位以后的数字,就得出盈数.祖冲之究竟是否同时用过内接和外切这两个方法求出圆周率的朒数和盈数,是没有确切史料可以证实的.但是采用这个办法所求出的朒、盈两个数值,和祖冲之原来所求出的结果大体是一致的.所以有些数学史家认为祖冲之曾用过作圆的外切正多边形的方法求得圆周率,是很近情理的推想.但是根据另一些数学史家的研究,盈、朒两数也可以由计算圆内接正12288边形和正24576边形的边长而得出来.不过这种计算比较难懂,这里不说了.尽管说法有出入,但是祖冲之曾经求得“密率”,并且明确地用上、下两限来说明圆周率这个数值的范围,是可以肯定的.在一千五百年前,他有这样的成就和认识,真值得我们钦佩.在推算圆周率时,祖冲之付出了不知多少辛勤的劳动.如果从正六边形算起,算到24576边时,就要把同一运算程序反复进行十二次,而且每一运算程序又包括加减乘除和开方等十多个步骤.我们现在用纸笔算盘来进行这样的计算,也是极其吃力的.当时祖冲之进行这样繁难的计算,只能用筹码(小竹棍)来逐步推演.如果头脑不是十分冷静精细,没有坚韧不拔的毅力,是绝对不会成功的.祖冲之顽强刻苦的研究精神,是很值得推崇的.。
这个比较难懂,我补充个别人的解释吧 ———————————————————— 一、源程序 本文分析下面这个很流行的计算PI的小程序。
下面这个程序初看起来似乎摸不到头脑, 不过不用担心,当你读完本文的时候就能够基本读懂它了。 程序一:很牛的计算Pi的程序 int 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); } 二、数学公式 数学家们研究了数不清的方法来计算PI,这个程序所用的公式如下: 1 2 3 k pi = 2 + --- * (2 + --- * (2 + --- * (2 + 。
(2 + ---- * (2 + 。 ))。
))) 3 5 7 2k+1 至于这个公式为什么能够计算出PI,已经超出了本文的能力范围。 下面要做的事情就是要分析清楚程序是如何实现这个公式的。
我们先来验证一下这个公式: 程序二:Pi公式验证程序 #include "stdio.h" void main() { float pi=2; int i; for(i=100;i>=1;i--) pi=pi*(float)i/(2*i+1)+2; printf("%f\n",pi); getchar(); } 上面这个程序的结果是3.141593。 三、程序展开 在正式分析程序之前,我们需要对程序一进行一下展开。
我们可以看出程序一都是使用 for循环来完成计算的,这样做虽然可以使得程序短小,但是却很难读懂。根据for循环 的运行顺序,我们可以把它展开为如下while循环的程序: 程序三:for转换为while之后的程序 int a=10000,b,c=2800,d,e,f[2801],g; main() { int i; 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; } } 注: for([1];[2];[3]) {[4];} 的运行顺序是[1],[2],[4],[3]。
如果有逗号操作符,例如:d=0,g=c*2,则先运行d=0, 然后运行g=c*2,并且最终的结果是最后一个表达式的值,也就是这里的c*2。 下面我们就针对展开后的程序来分析。
四、程序分析 要想计算出无限精度的PI,我们需要上述的迭代公式运行无数次,并且其中每个分数也 是完全精确的,这在计算机中自然是无法实现的。那么基本实现思想就是迭代足够多次 ,并且每个分数也足够精确,这样就能够计算出PI的前n位来。
上面这个程序计算800位 ,迭代公式一共迭代2800次。 int a=10000,b,c=2800,d,e,f[2801],g; 这句话中的2800就是迭代次数。
由于float或者double的精度远远不够,因此程序中使用整数类型(实际是长整型),分 段运算(每次计算4位)。我们可以看到输出语句 printf("%.4d",e+d/a); 其中%.4就是 把计算出来的4位输出,我们看到c每次减少14( c=c-14;),而c的初始大小为2800,因 此一共就分了200段运算,并且每次输出4位,所以一共输出了800位。
由于使用整型数运算,因此有必要乘上一个系数,在这个程序中系数为1000,也就是说 ,公式如下: 1 2 3 k 1000*pi = 2k+ --- * (2k+ --- * (2k+ --- * (2k+ 。 (2k+ ---- * (2k+ 。
)). ..))) 3 5 7 2k+1 这里的2k表示2000,也就是f[2801]数组初始化以后的数据,a=10000,a/5=2000,所以下面 的程序把f中的每个元素都赋值为2000: for(i=0;i<c;i++) f[i]=a/5; 你可能会觉得奇怪,为什么这里要把一个常数储存到数组中去,请继续往下看。 我们先来跟踪一下程序的运行: while(c!=0) 假设这是第一次运行,c=2800,为迭代次数 { d=0; g=c*2; 这里的g是用来做k/(2k+1)中的分子 b=c; 这里的b是用来做k/(2k+1)中的分子 while(1) { d=d+f[b]*a; f中的所有的值都为2000,这里在计算时又把系数扩大了 a=10000倍。
这样做的目的稍候介绍,你可以看到 输出的时候是d/a,所以这不影 计算 g--; f[b]=d%g; 先不管这一行 d=d/g; 第一次运行的g为2*2799+1,你可以看到g做了分母 g--; b--; if(b==0) break; d=d*b; 这里的b为2799,可以看到d做了分子。 } c=c-14; printf("%.4d",e+d/a); e=d%a; } 只需要粗略的看看上面的程序,我们就大概知道它的确是使用的那个迭代公式来计算Pi 的了,不过不知道到现在为止你是否明白了f数组的用处。
如果没有明白,请继续阅读。 d=d/g,这一行的目的是除以2k+1,我们知道之所以程序无法精确计算的原因就是这个除 法。
即使用浮点数,答案也是不够精确的,因此直接用来计算800位的Pi是不可能的。那 么不精确的成分在哪里?很明显:就是那个余数d%g。
程序用f数组把这个误差储存起来 ,再下次计算的时候使用。现在你也应该知道为什么d=d+f[b]*a;中间需要乘上a了吧。
把分子扩大之后,才好把误差精确的算出来。 d如果不乘10000这个系数,则其值为2000,那么运行d=d/g;则是2000/(2*2799+1),这 种整数的除法答案为0,根本无法迭代下去了。
现在我们知道程序就是把余数储存起来,作为下次迭代的时候的参数,那么为什么这么 做就可以使得下次迭代出来的结果为 接下来的4位数呢? 这实际上和我们在纸上作除法很类似: 0142 /——------ 7 / 1 10 7 --------------- 30 28 --------------- 20 14 --------------- 60 。.. 我们可以发现,在做除法的时候,我们通常把余数扩大之后再来计算,f中既然储存的是 余数,而f[b]*a;则正好把这个余数扩大了a倍,然后如此循环下去,可以计算到任意精 度。
这里要说明的是,事实上每次计算出来的d并不一定只。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:2.431秒