两个浮点数的计算平均值的数学性质?

Mathematical properties of the computed average value of two floating point numbers?

我计算两个浮点数 x 和 y 的平均值。 (我在 Java 中使用了 double 类型)因为当我用它进行最大-最小搜索时,我真的很想确保这个操作能够始终如一地工作(从数学的角度来看)。我担心如果 x 和 y 相等或几乎相等会发生什么?

我用以下公式计算平均值:

double average = (x + y) / 2.0;

假设 (x + y) 的和没有溢出,我有三个问题 该平均值的数学性质:

  1. if (x < y) 并且 x 和 y 之间至少有一个数字 space(可以是 在浮点系统中表示),然后我可以安全地假设:

average > x && average < y; 保证总是正确的?

  1. if (x < y) 但它们尽可能靠近(这样就没有 space 可以在浮点系统中表示的 x 和 y 之间的数字),那么我可以安全地假设:

average == x || average == y; 保证永远正确?

  1. if (x == y) 然后我可以安全地假设:

average == x; 保证总是正确的?

我想知道的另一件事是,计算平均值是否更好: double average = x / 2.0 + y / 2.0; 我知道在浮点数学中,分配律一般不等价,但我不知道应该使用哪一个。有没有大体推荐的方式?

  1. if (x < y) and there is space between x and y for at least one number (that can be represented in the floating point system), can I then safely assume that:

average > x && average < y; is guaranteed to be always true?

是的,除了溢出。如果 x+y 溢出(产生无穷大),则 double average = (x + y) / 2.0; 产生无穷大。否则,考虑 x+y 等于 (x/2 + y/2)•2,并且 x/2+y /2 必须比 sy 更接近 xy 之间的数字。因此,将 x/2 + y/2 与浮点运算相加将产生该数字(如果有多个,则在 xy 之间产生其他数字之一),所以添加 xy 必须产生两倍的数字(只要它不溢出)。然后 (x+y)/2 给了我们那个数字。

(只要指数保持在范围内,任何 2*a+2*b 都必须产生与 2*(a+b) 相同的结果,因为所有有效数算术保持相同——所有舍入都发生在相对位置到尾数。这仅适用于二的幂。例如,4*a+4*b 产生与 4*(a+b) 相同的结果也是如此。但 3*a+3*b 产生的结果并不总是正确的结果与 3*(a+b) 相同。)

  1. if (x < y) but they are as close together as possible (so that there is no space for a number between x and y that can be represented in the floating point system), can I then safely assume that:

average == x || average == y; is guaranteed to be always true?

是的,除了溢出。如上所述,添加 x/2 和 y/2 将产生 xy,因此 x+y 产生 2•x 或 2 •y.

  1. if (x == y) can I then safely assume that:

average == x; is guaranteed to be always true?

是的,除了溢出。

One more thing I wonder about is if it might be better do compute the average with: double average = x / 2.0 + y / 2.0;

除非在 x+y 中出现溢出或在 x/2y/2 中出现下溢,否则这不会有任何区别。