lan*_*neo 5 java floating-point distance
对于Java程序,我编写了一个方法来计算两个浮点数之间的距离。该方法对于输入顺序对称地工作是非常重要的。目前我正在使用的方法:
double distanceBetween(double a, double b) {
return Math.abs(a - b); // I assume that a-b = -(b-a)
}
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否总是对称的,或者我是否应该将代码更改为:
double distanceBetween(double a, double b) {
if (a > b) return a - b;
else return b - a;
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是
Math.abs(a - b) == Math.abs(b - a)
Run Code Online (Sandbox Code Playgroud)
保证 a 和 b 的所有值始终为真?或者在某些情况下(由于使用浮点数学)结果是否可能不完全相同?
\n\n计算两个浮点数之间的距离是否对称?
\n
在 Java\xe2\x80\x99s 原生浮点运算中是,在其他语言中使用非对称舍入方法时不是,在 Java\xe2\x80\x99s 中BigDecimal
使用非对称舍入方法时可能不是(见末尾)。
IEEE 754-2019 5.1 说:
\n\n\n\xe2\x80\xa6 除非另有说明,否则本标准指定的返回数字结果的每个计算操作都应执行,就像它首先生成一个精确到无限精度且范围无界的中间结果,然后对该中间结果进行舍入,如有必要,以适合目标\xe2\x80\x99s格式(参见4和7)\xe2\x80\xa6
\n
减法和绝对值是标准指定的返回数字结果的运算,并且没有\xe2\x80\x9c否则为它们指定\xe2\x80\x9d 语句。IEEE 754 浮点格式在符号方面是对称的;对于任何可表示的数字x, \xe2\x88\x92 x也是可表示的。因此,使用任何对称舍入方法,如果a \xe2\x88\x92 b四舍五入到某个数字x,则b \xe2\x88\x92 a四舍五入到 \xe2\x88\x92 x。
\nIEEE 754 指定了非对称舍入模式,例如向无穷大舍入(向上舍入)。使用非对称舍入模式时,a \xe2\x88\x92 b并不总是对称舍入到b \xe2\x88\x92 a。例如,使用假设的两位十进制浮点数,14 - 1.7
将产生结果 13(14 \xe2\x88\x92 1.7 = 12.3,向上舍入为 13),但 1.7 \xe2\x88\x92 14将产生 \xe2\x88\x9212 (1.7 \xe2\x88\x92 14 = \xe2\x88\x9212.3,向上舍入为 \xe2\x88\x9212)。
但是,Java 不对其本机浮点运算使用非对称舍入模式(Java 虚拟机规范,Java SE 18 版,2022 年 2 月 23 日,第 2.8 节,第 20 页)。
\n取绝对值永远不会四舍五入,因为它的数学结果总是可表示的,因此它不是分析中的一个因素。
\nJava\xe2\x80\x99sBigDecimal
对非对称舍入方法有一些支持,但我不清楚这些是否内置到操作中(即,将在减法期间自动执行)还是必须手动应用。如果前者是 cae,则a \xe2\x88\x92 b和b \xe2\x88\x92 a并不总是产生对称结果BigDecimal
。