了解灾难性取消中的ulps
我正在阅读每个计算机科学家应该知道的关于浮点的内容,但我不理解以下声明:
当操作数受到舍入误差时,发生灾难性的取消。 例如在二次公式中,会出现表达式b2-4ac。 数量b2和4ac受到舍入误差的影响,因为它们是浮点乘法的结果。 假设它们四舍五入到最接近的浮点数,所以精确到0.5 ulp以内 。 当它们被扣除时,取消可能导致许多准确的数字消失,主要是由舍入误差污染的数字。 因此,差异可能会有很多ulps的错误。 例如,考虑b = 3.34,a = 1.22和c = 2.28。 b2 - 4ac的确切值是.0292。 但b2轮到11.2和4ac轮到11.1,因此最终答案是0.1 ,这是70 ulps的错误 ,即使11.2 - 11.1完全等于.1。 减法没有引入任何错误,而是暴露了前面乘法中引入的错误。
从我读过的信息来看,ulps是最后一个单位,所以如果我用11.2来轮换11.1556,我可以在最后一个位置最多有0.5个单位,即最大为0.05的错误。
但为什么如果我得到11.2 - 11.1 = 0.1,这是一个70 ulps的错误? 我会认为这最后一个值是0.7 ulps的错误
如果将错误0.1 - 0.0292 = 0.0708
与精确结果( 0.0001
)的ulp相关联,则错误甚至会达到708 ulps
。 原始版本在这里包含一个错字(参见参考脚注6)。