浮点数的最佳中点公式是什么?

Wai*_*aam 5 numerical numerical-analysis

第一个公式

m = (a + b) / 2
Run Code Online (Sandbox Code Playgroud)

很简单,但是有很大的溢出风险。此外,Burden and Faires的《第9版数值分析》指出:

当b-a接近机器的最大精度时,(a + b)/ 2可能返回一个中间点,该中间点甚至不在[a,b]区间内。

尽管没有提供进一步的解释。

第二个

m = a + (b - a) / 2
Run Code Online (Sandbox Code Playgroud)

也是正确的,溢出的可能性较小。但是对于浮点数,a和b几乎相等的值可能会导致重要性下降。

那么,哪种公式在实践中更好?另外,将理解对引用语句的解释。

Dav*_*ing 3

简单的情况(a+b)/2可能并不像您想象的那么容易溢出\xe2\x80\x94对于 IEEE 754 双精度,至少其中一个操作数必须至少为 8.988e307(最大有限值 1.788e308 的一半)才会溢出a+b。此外,如果它没有溢出,那么它会被正确舍入(同样,对于 754),因为最多一次运算舍入(除法(可能)仅对小于 4.450e-308 的数字进行舍入(降至 5e-324 的绝对最小值) ,并且没有任何加法的结果在每一轮中都接近于 0)。由于它是正确舍入的,因此它当然不能在 [ a , b ] 之外,因为其中至少有一个更接近真实值。

\n\n

如果您可能溢出,则至少有一个值非常大,因此您可以只使用a/2+b/2,然后它也会正确舍入(因为每个除法都是精确的或不相关的)。这当然又是一种浮点运算。

\n\n

需要注意的是,舍入模式可能会使用这些公式产生意外的上溢或下溢,但这并不是一个常见问题。

\n\n

至于,如果ab可能有不同的符号,a+(b-a)/2则它\xe2\x80\x99s同样会导致溢出。然而,它并没有\xe2\x80\x99t的意义\xe2\x80\x9c损失\xe2\x80\x9d关注:虽然大近似值的小差异的相对误差当然可能非常大,但这样的操作就精确的浮点输入值而言始终是精确的,因此除了任何此类计算中固有的问题之外,不会产生任何数值问题。

\n