第一个公式
m = (a + b) / 2
简单,但是存在很大的溢出风险。除了,数值分析,第 9 版伯登和费尔斯指出
当 b - a 接近机器的最大精度时,(a + b) / 2 有可能返回一个在区间 [a, b] 中不均匀的中点。
尽管没有提供进一步的解释。
第二个
m = a + (b - a) / 2
也是正确的,溢出的可能性较小。但对于浮点数,a 和 b 的值几乎相等可能会导致意义丧失。
那么,在实践中哪个公式更好呢?此外,对报价声明的解释将不胜感激。
简单的(a+b)/2
也许并不像您想象的那样容易溢出 - 对于 IEEE 754 双精度,至少其中一个操作数必须至少为 8.988e307(最大有限值 1.788e308 的一半)a+b
溢出。而且,如果不溢出的话正确舍入(同样,对于 754)因为最多进行一次运算(除法(可能)仅对小于 4.450e-308 的数字进行舍入(降至绝对最小值 5e-324),并且没有结果接近 0 的加法永远循环)。既然它是正确舍入的,它当然不能在 [a,b] 因为其中至少有一个更接近真实值。
如果你可能溢出,至少你的一个值非常大,所以你可以使用a/2+b/2
,然后也被正确舍入(因为每个除法都是精确的或不相关的)。这当然又是一种浮点运算。
有一个警告是舍入模式这些公式可能会产生意外的溢出或下溢,但这不是一个常见问题。
As for a+(b-a)/2
,如果出现溢出,情况同样糟糕a and b可能有不同的迹象。然而,它并不存在“意义丧失”的担忧:虽然relative大近似值的小差异的误差当然可能非常大,这样的操作总是exact就精确的浮点输入值而言,因此不会造成任何此类计算中固有的任何数值问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)