李 鑫,王 璐,林金花,韩 冬,谷德山
(1.长春工业大学软件职业技术学院,吉林长春 130012; 2.东北师范大学物理学院,吉林长春 130024)
4种计算自然常数e的方法及精度比较
李 鑫1,2,王 璐1,林金花1,韩 冬1,谷德山2
(1.长春工业大学软件职业技术学院,吉林长春 130012; 2.东北师范大学物理学院,吉林长春 130024)
用V isual C++6.0语言设计了3种计算方法:利用极限、级数、积分计算自然常数e的值.经过不断改进,让计算机按照人的思维方式对e的值进行了计算.计算结果表明:利用极限计算的e值能精确到小数点后8位;利用级数和定积分计算的e值精确到小数点后16位;利用人的思维方式计算e的值能精确到小数点后800位.
自然常数e;Visual C++6.0;精度;人的计算方式
假设投资1元钱在一个银行账户上,每年的年利率为r,每年结算一次,经过t年后,可以拿到的本息为S1=(1+r)t.如果半年结算一次(即一年结算2次),本息为S2=(1+r/2)2t.如果一年结算n次,为了计算方面,假设r和t都等于1,则本息为Sn=(1+1/n)n.当n→∞时,(1+1/n)n=2.718 28….1727年,瑞士数学家欧拉用字母e来代表这个数,后来人们把e叫做自然常数,它是一个无理数,也是一个超越数[1].目前网上能查到e小数点后2 000位,因此,计算e的本身意义并不大.由于e是一个无理数,通过计算e可以让我们更深刻地认识编程语言中数字类型所能达到的精度.
C++语言是当今最流行的面向对象程序设计语言,而Visual C++是M icrosoft公司开发的基于Window s操作系统的C++语言程序的可视化编程工具[2],现在流行的版本是Visual C++6.0.双精度型是它数字类型中精度最高的,可以精确到小数点后16位有效数字.本文分别用极限、级数和定积分计算e的值,计算结果的最大精度只能达到小数点后16位.为了提高精度,本文让计算机按照“人的计算方式”计算级数,使e的精度提高到小数点后800位.
e的计算公式为
Visual C++中的数字类型主要有整型(int)、实型(float)以及双精度型(double).整型的取值范围是-231~231,即-2 147 483 648~2 147 483 647.整型的计算结果只保留整数部分,很明显不适合用此公式计算e的值.实型的取值范围比较大(-3.4×10-38~3.4×1038),但是它只能保留小数点后8位有效数字.双精度型的取值范围非常大(-1.7×10-308~1.7×10308),能保留小数点后17位有效数字(精确到16位)[3],因此本文在计算e的时候选择双精度型.
根据(1)式,计算e的代码如下:
本程序执行后,e的计算值见表1.由表1可见,利用极限计算e的值只能精确到小数点后8位,超过8位的数值与真实值偏差较大.
表1 利用极限计算e的值
通过分析程序和表1,可以得到下面两个现象:
(1)在程序中,希望e保留到小数点后20位,但是实际输出结果只保留到小数点后16位;
(2)由(1)式可知,随着n的增大,e的计算值越接近e的真实值.但由表1中的数据可以看出,当n≥109后,e的计算值不是接近e的真实值,而是大于真实值.
用M aclaurin公式把f(x)=ex展开,并令x=1,可以得到[4]
(2)式中需要重复计算整数的阶乘的倒数,可以用Visual C++中的循环结构.这是一个无穷级数,为了节省时间,本文只计算到n=99,让输出结果保留到16位小数,代码如下:
这段代码的运行结果如表2所示.由表2可以看出,随着n的增大,e的计算值越来越接近e的真实值.但是,当n的值大于17后,计算的精度并没有提高,原因是双精度型只能精确到小数点后16位,对于e来说只能精确到个位以及小数点后15位,而再往下计算已经没有意义了.
表2 利用级数计算e的值
通过比较利用极限和利用级数两种算法可以看出,解决同一个问题,不同的算法得到的精度是不同的.在公式(1)中和n都只能精确到小数点后16位,两者乘方结果的精度必然下降,由计算结果可知,只能精确到小数点后8位.在公式(2)中,每一项都能精确到小数点后16位,而e是所有项的和,仍然能够精确到小数点后16位.所以,在以后的程序编写中,如果对精度有要求,应该尽量使用加、减运算,少用其他的运算(例如乘、除、乘方、对数等).
由定积分公式可得
在直角坐标系中,x=1,y=1/x,x=e,y=0所包围的面积等于1.在程序编写中,如果用for循环,必须计算出有多少个面积元,比较麻烦,所以本文采用w hile循环,代码如下:
计算结果如表3所示.由表3可以看出,随着dx取值的减小,e的计算值越来越接近真实值.本文只计算到dx=10-9,原因是这种算法非常费时,dx每小一个数量级,运行时间就增加10倍.计算机的运行速度虽然快,但不是无限大,在以后的程序设计中应该考虑运行所需的时间.而前两种及后一种计算方法所需的时间都非常短.另外,dx和x都只能精确到小数点后16位,它们的商所能精确的位数应该比16小,在往下计算没有太大的意义.
表3 利用定积分计算e的值
在V isual C++中的数字类型中,精度最高的是双精度型,只能精确到小数点后16位,e的计算值能不能超过16位呢?答案是肯定的.原因是即使没有计算机,在时间充裕的情况下,只用纸和笔一定能够得到想要的精度.计算机是我们的工具[5-8],如果让它按我们的思维方式去计算,也一定能够得到我们想要的精度.假设用纸和笔计算e(精确到小数点后49位),我们一般选择公式(2),首先计算出,然后最后加1,结果就是e的计算值.在这个计算过程中,除法和竖式加法都是按照人的思维方式进行的,程序代码如下:
此程序计算出的e值如表4所示,我们想精确到小数点后49位,实际只精确到小数点后48位,原因是我们把49位之后的数字都省略了,被省略的数字之和可能大于10,应该向49位进位,从而影响了49位的精度.所以,如果想精确到小数点后49位,我们应该保留到51位.如果感兴趣的话,还可以用此方法继续往下计算,由于受数组个数的限制,最多能够精确到小数点后800位.
表4 利用人的思维方式计算e的值
本文用4种方法计算出e的值,由于算法不同,计算的精度也不同.如果让计算机按照公式去计算, e所能达到的最大精度为16位.如果让计算机按照“人的计算方式”去计算,e所能达到的最大精度为800位,所需的运行时间也非常短.由此可以看出,计算机只是我们的工具,在解决问题时我们应该灵活运用这个工具.
[1] 庞荣波.浅谈自然常数e的命名者——欧拉[J].科教文汇,2009(1):274.
[2] 黄全舟.Visual C++技术特点分析[J].西安石油大学学报:自然科学版,2001,16(1):60-63.
[3] 刘斌,王忠.面向对象程序设计——Visual C++[M].北京:清华大学出版社,2003:3-4.
[4] 同济大学数学教研室.高等数学[M].北京:高等教育出版社,2002:175-176.
[5] 周治国,李文印,李同,等.基于RFID的汽车号牌自动识别系统的安全性设计[J].东北师大学报:自然科学版,2008,40(2): 34-38.
[6] 蒲东兵,塔娜,马志强,等.一种实用监控系统的人脸检测定位算法[J].东北师大学报:自然科学版,2009,41(1):40-43.
[7] 何东晓,周春光,刘淼,等.手写数字识别中组合式神经网络的构建方法[J].吉林大学学报:理学版,2009,47(6):1212-1217.
[8] 徐沛娟,李雄飞,惠玥,等.中文文本分类相关算法的研究与实现[J].吉林大学学报:理学版,2009,47(4):792-796.
Four methods of computing e and comparing the precision
L IXin1,2,WANG Lu1,L IN Jin-hua1,HAN Dong1,GU De-shan2
(1.School of Software Vocational Technology,Changchun University of Technology,Changchun 130012,China; 2.School of Physics,Northeast Normal University,Changchun 130024,China)
Three calculation methods were designed by Visual C++6.0.They computed the mathematical constant e respectively by limit,p rogression and integral.A t last,the computer computed e according to human method of computation.The result computed by limit or integral can accurate to 7 decimal p laces.The result computed by p rogression can accurate to 15 decimal p laces.The result computed according to human method of computation can accurate to 800 decimal p laces.
mathematical constant e;Visual C++6.0;p recision;human method of computation
TP274+.2
520·40
A
1000-1832(2010)04-0057-05
2010-09-10
吉林省科技发展计划项目([2005]55).
李鑫(1977—),女,硕士;谷德山(1955—),男,教授,主要从事粒子物理与原子核物理研究.
(责任编辑:石绍庆)