同符号数相加“大数吃小数”的界限:数值试验

2014-08-06 07:02李建平
关键词:大数界限小数

曹 靖 ,李建平

(1.中国科学院a.大气物理研究所,b.研究生院,北京100029;2.天津理工大学理学院,天津300384)

“大数吃小数”现象[1]是数值运算中常见的一种影响计算精度的现象,当以计算机计算一个实数a与实数b≠0的代数和时,如果|b|相对于|a|小到一定程度,会出现a+b=a的现象,一般称作数b被数a“吃掉”了.“大数吃小数”现象一个典型的例子[2]就是计算N个实数的累加和3,…,N.若以正常顺序累加,则自a2之后所有元素均被a“1吃掉”,累加结果为如果N取值很大,那么很可能是个较大的数,这样数值计算就会有一个较大的误差.另一个例子是在数值运算的网格剖分中,如果剖分选取的分辨率(步长)过小,那么计算过程中它有可能会被“吃掉”,出现网格的某些节点无法生成的情况,从而进一步影响数值运算精度.

目前,已存在一些避免“大数吃小数”现象的方法[2,3].做N个实数的累加和时,可调换相加顺序,将绝对值较小的数先进行累加,以避免“大数吃小数”现象,但仍存在2种风险:1.前面“小数”的累加值相比于后面“大数”仍然足够小到被“吃掉”,调换顺序起不到作用;2.前面若干“小数”的累加值远大于后面的“大数”,从而将其“吃掉”,使运算结果更加不可预料.可见,仅靠目前的方法并不能完全避免危及精度的现象发生.为真正避免此类现象的发生,找到准确判断其发生的界限,就显得十分迫切和必要.本研究针对两同符号数相加的问题,通过数值试验与理论分析,给出“大数吃小数”现象发生的界限,从而为实际运算提供理论指导.

1 机器双精度下“大数吃小数”的界限

1.1 两正数相加的数值试验

设A>0为一“大数”,CA>0为可被A“吃掉”的最大“小数”.在计算机双精度下,分别应用Matlab、Fortran以及C等3种计算机语言进行大量数值试验,发现3种语言计算出的A与CA的关系都呈现出相同的规律.以Matlab为例,给出A∈[0.1,10]时的部分试验结果,如图1所示.由图1可见,A所处的区域可被分为若干区间段,在每个区间段内,虽然A的取值不同,但被其吃掉的最大“小数”CA却十分接近,从而图形呈现阶梯形状.特别地,在每个区间段内,lg A与lg(CA/A)之间呈现线性关系,因此,下面考虑应用这种分段线性关系,推导出CA的计算公式.

图1 机器双精度下A与CA及lg A与lg(CA/A)的关系Fig.1 A versus CAand lg A versus lg(CA/A),under double machine precision

1.2 两正数相加lg(CA/A)关于lg A的分段线性拟合

为考察lg(CA/A)关于lg A的分段线性关系,进行了大量数值试验.首先,根据试验数据计算出lg(CA/A)关于lg A斜率的变化规律,将lg A所属区间进行分段,即估计出试验所涉及的每段线性区间的左、右顶点坐标.然后,分别计算出lg A每个分段区间的长度,以及区间内lg(CA/A)关于lg A线性拟合的斜率.部分试验结果见表1.

表 1 机器双精度下,当 A∈(10-2,102)时,lg(CA/A)与lg A线性关系Tab.1 Linear relationship between lg(CA/A)and lg A,when A∈(10-2,102),under double machine precision

由表1可见,不同区间段之间满足十分相似的线性关系:lg A分段区间长度都近似为0.301,并且,每个区间段内,lg(CA/A)关于lg A线性拟合的斜率都接近于-1,且 lg(CA/A)均在[-16.256,-15.955]范围内单调递减.由此便可估计lg(CA/A)关于lg A的分段线性拟合函数.

首先,给出每个分段线性区间左顶点坐标.由表1可见,lg A=0为某一分段区间的左顶点,又因每个区间段长度均近似为0.301,则可记“大数”A属于第k(k∈Z)段区间,其中 k=floor(lg A/0.301),floor表示向负无穷方向取整.并且,此第k段区间的左顶点坐标应为(0.301k,-15.955),k∈Z.然后,以表示 CA的分段线性拟合近似值,若A属于第k段区间,结合上述试验中区间段内lg(CA/A)关于lg A线性拟合的斜率以及左顶点坐标,得此区间段内lg(/A)关于lg A的线性拟合函数为

为验证式(1)的拟合效果,随机选取不同的“大数”A,将数值试验得到的CA值与由式(1)计算出的拟合值进行比较,见表2.表2数据说明式(1)具有良好的拟合效果.

表2 机器双精度下与CA比较Tab.2 Comparison between and CAfor random,under double machine precision

表2 机器双精度下与CA比较Tab.2 Comparison between and CAfor random,under double machine precision

A数值试验结果CA 拟合值C A 1.00 1.109×10-16 1.109×10-16 16.13 1.776×10-15 1.774×10-15 282.60 2.839×10-14 2.838×10-14 3 596.00 2.269×10-13 2.270×10-13 7.92×106 4.653×10-10 4.645×10-10 1.00×10-2 8.670×10-19 8.670×10-19 3.45×10-3 2.167×10-19 2.168×10-19 5.88×10-5 3.383×10-21 3.388×10-21

1.3 两负数相加情况

设A′<0为一“大数”,应寻找C′A为全体负数中可被A′吃掉的最小的“小数”,同时也是绝对值最大的“小数”.大量数值试验结果表明,当|A′|=A时,总有|C′A|=CA.因此,可将上述两正数相加情况的分段线性拟合结果直接推广至两负数相加情况.令′A为C′A的拟合值,则结合式(1)可得

1.4 双精度下“大数吃小数”界限的近似公式

结合式(1)与式(2),可得机器双精度下两同号数相加时,“大数吃小数”现象发生界限的统一近似公式.

结论1 在机器双精度下进行运算,对于任意符号相同的两实数A与B,当且仅当|B|≤CA时,机器运算结果为A+B=A,其中

2 机器单精度下“大数吃小数”的界限

经与双精度类似的过程分析,可得机器单精度下“大数吃小数”界限的统一近似公式.

结论2 在机器单精度下进行运算,对于任意符号相同的两实数a与b,当且仅当|b|≤ca时,机器运算结果为a+b=a,其中

表3给出对于随机选出的不同“大数”a,可被其“吃掉”的最大“小数”ca的数值试验值与由式(4)计算出的近似值ca的比较结果,这些结果说明式(4)有良好的估计效果.

表3 机器单精度下ca试验值与式(4)近似值ca比较结果Tab.3 Comparison between caand cafor random,under single machine precision

3 任意机器精度“大数吃小数”界限的普适近似公式

公式(3)与公式(4)非常相似,只有指数上的一个常系数不同,单精度为7.225,双精度为15.955.若记所选机器精度的二进制有效位数为n,则机器单双精度下n分别为24和53[4].注意到24lg 2≈7.224 7,53lg 2≈15.954 6,也就是说,此常系数可由n近似推算出来,为nlg 2,由此推测CA与ca的近似表达式与n有关.因此,在具有n位二进制有效数字的机器下进行运算,将被“大数”a“吃掉”的“小数”界限记为ca,n,结合结论1和结论2,得任意机器精度下“大数吃小数”界限的普适近似公式.

结论3 在具有n位二进制有效数字的机器精度下进行运算,对于任意符号相同的两实数a与b,当且仅当|b|≤ca,n时,机器运算结果为 a+b=a,其中

4 结论

通过数值试验,为数值运算中避免“大数吃小数”现象给出了界限,结论3适用于任意机器精度和任意计算机语言,可方便应用于实际的数值计算中.下一步考虑利用二进制对位相加过程[5],对于“大数吃小数”问题进行理论分析,并给出更为严格的理论界限.

另外,关于“大数吃小数”现象,本文只讨论了同号的情况,可应用类似的方法研究两异号数相加的情况,找到“大数吃小数”现象发生的统一界限公式.

[1]刘目楼,汪卉琴.数值分析[M].北京:冶金工业出版社,2005.

[2]李庆扬,王能超,易大义.数值分析[M].北京:清华大学出版社,2008.

[3]徐士良.计算机常用算法[M].北京:清华大学出版社,2005.

[4]朱亚超.基于IEEE754的浮点数存储格式分析研究[J].计算机与信息技术,2006(9):50-52.

[5]GOLDBERGD.ComputerArithmetic[M].Amsterdam:ElsevierScience,2003.

猜你喜欢
大数界限小数
界限
小数加减“四不忘”
间隙
我国古代的小数
小数的认识
小数的认识
“大数的认识”的诊断病历
破次元
超级英雄教你大数的认识
看看德国人的家庭界限感