确切地讲,不超过10个10进制数进行加减法运算,中间结果应比指定位要求的精度再精确一位。
这样做的目的是,合理控制误差。
在作为数学课程的数值分析里,有有效数字和可靠数字的概念。(在中学数学、物理学及其它学科里也常见有效数字的概念,有的人的理解可能跟这里的不太一样,不过重要的是对误差的控制。)
绝对误差是近似值与真值的差。
相对误差是绝对误差除以真值。
可靠数字指的是,绝对误差不超过该位的一个单位。
有效数字指的是,绝对误差不超过该位的半个单位。
比如,3.24,如果直到百分位的4都是可靠数字,那么误差不超过0.01,也就是真值为3.23-3.25之间。
如果直到百分位的4都是有效数字,那么误差不超过0.005,也就是真值为3.235-3.245之间。
做近似运算的时候,我们拿到的是近似值,可以推测出真值的区间,借此推出最终结果的区间,得到合理的近似值。
比如说我们要算3.24 4.35,假设直到百分位都是有效数字。
3.24代表的数为3.235-3.245之间。
4.35代表的数为4.345-4.355之间。
所以结果是7.580-7.590之间。
最坏的结果是同向误差叠加,变成0.005的两倍。
那么,显然,n个这样的数字,最坏的情况下,误差是n倍。那么10个数相加减,最坏的情况下就是误差放大十倍,也就是损失1位有效数字。
如果从一开始多取一位,就能保证结果除了多取的那一位全是有效的。
把上面的有效数字全部换成可靠数字,结果也是一样的。
(一般不会可靠数字跟有效数字混合用,如果已知数据是混合的,应当一律以真值的区间分析为准。以下我们都默认按有效数字来。)
从这个分析中,我们不难看出,如果是100个数相加减,那多一位是不够的,得多两位。
可以进一步得出,k进制下,不超过k^q个数相加减,应当比指定位要求的精度多保留k位数字。
这里还要注意一个问题,如果不是指定的具体位(精确到千位/百分位),而是结果具有几位有效数字。如果算加减法,那必须先分析结果大概有多大,把对应的具体位找出来才能近似。
比如,计算3.1415926549823-3.1415926535894,两个相近的数相减,答案非常小,相对误差会难以控制,你不能说答案要两位有效数字我直接先把每个都先近似成三位的,那是不行的。必须先判断结果的最高位在亿分位上,可以近似到百亿分位计算。
不过,如果是乘法,在误差都很小的时候,从而它们的平方更小以致可以忽略时,可以认为相对误差近似叠加,两个n位精度的数相乘,答案只要两位我可以把每个都近似成三位再算。(但很多很多个近似数相乘的时候,省略的平方项可能会有影响)
除法按乘以倒数来处理。
除以0.2,应该是除以0.15到0.25之间的数,也就是乘以4到6.666667之间的数。
可见,取倒数会让误差有复杂的变化。
对于其它情况呢?比如三角函数。
由于|sin(x)-sin(y)|<=|x-y|,正弦余弦是不会放大误差的,有效数字已知几位算下来还是几位,不会少。
而tan函数没有这样的性质,应当按区间分析重新讨论。如果你要算的数在pi/2附近,函数穿越无穷大,那么必须非常高的精确度,否则当真值可能的区间覆盖了pi/2时,你只能得到一个绝对值的下界估计。