两个浮点数的计算平均值的数学性质?
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) 的和没有溢出,我有三个问题
该平均值的数学性质:
if (x < y)
并且 x 和 y 之间至少有一个数字 space(可以是
在浮点系统中表示),然后我可以安全地假设:
average > x && average < y;
保证总是正确的?
if (x < y)
但它们尽可能靠近(这样就没有 space 可以在浮点系统中表示的 x 和 y 之间的数字),那么我可以安全地假设:
average == x || average == y;
保证永远正确?
if (x == y)
然后我可以安全地假设:
average == x;
保证总是正确的?
我想知道的另一件事是,计算平均值是否更好:
double average = x / 2.0 + y / 2.0;
我知道在浮点数学中,分配律一般不等价,但我不知道应该使用哪一个。有没有大体推荐的方式?
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 必须比 s
或 y
更接近 x
和 y
之间的数字。因此,将 x
/2 + y
/2 与浮点运算相加将产生该数字(如果有多个,则在 x
和 y
之间产生其他数字之一),所以添加 x
和 y
必须产生两倍的数字(只要它不溢出)。然后 (x+y)/2
给了我们那个数字。
(只要指数保持在范围内,任何 2*a+2*b
都必须产生与 2*(a+b)
相同的结果,因为所有有效数算术保持相同——所有舍入都发生在相对位置到尾数。这仅适用于二的幂。例如,4*a+4*b
产生与 4*(a+b)
相同的结果也是如此。但 3*a+3*b
产生的结果并不总是正确的结果与 3*(a+b)
相同。)
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 将产生 x
或 y
,因此 x+y
产生 2•x
或 2 •y
.
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/2
或 y/2
中出现下溢,否则这不会有任何区别。
我计算两个浮点数 x 和 y 的平均值。 (我在 Java 中使用了 double 类型)因为当我用它进行最大-最小搜索时,我真的很想确保这个操作能够始终如一地工作(从数学的角度来看)。我担心如果 x 和 y 相等或几乎相等会发生什么?
我用以下公式计算平均值:
double average = (x + y) / 2.0;
假设 (x + y) 的和没有溢出,我有三个问题 该平均值的数学性质:
if (x < y)
并且 x 和 y 之间至少有一个数字 space(可以是 在浮点系统中表示),然后我可以安全地假设:
average > x && average < y;
保证总是正确的?
if (x < y)
但它们尽可能靠近(这样就没有 space 可以在浮点系统中表示的 x 和 y 之间的数字),那么我可以安全地假设:
average == x || average == y;
保证永远正确?
if (x == y)
然后我可以安全地假设:
average == x;
保证总是正确的?
我想知道的另一件事是,计算平均值是否更好:
double average = x / 2.0 + y / 2.0;
我知道在浮点数学中,分配律一般不等价,但我不知道应该使用哪一个。有没有大体推荐的方式?
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 必须比 s
或 y
更接近 x
和 y
之间的数字。因此,将 x
/2 + y
/2 与浮点运算相加将产生该数字(如果有多个,则在 x
和 y
之间产生其他数字之一),所以添加 x
和 y
必须产生两倍的数字(只要它不溢出)。然后 (x+y)/2
给了我们那个数字。
(只要指数保持在范围内,任何 2*a+2*b
都必须产生与 2*(a+b)
相同的结果,因为所有有效数算术保持相同——所有舍入都发生在相对位置到尾数。这仅适用于二的幂。例如,4*a+4*b
产生与 4*(a+b)
相同的结果也是如此。但 3*a+3*b
产生的结果并不总是正确的结果与 3*(a+b)
相同。)
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 将产生 x
或 y
,因此 x+y
产生 2•x
或 2 •y
.
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/2
或 y/2
中出现下溢,否则这不会有任何区别。