Due to rounding errors, most floating-point numbers end up being slightly imprecise.
https://www.floating-point-gui.de/errors/comparison/
public static boolean nearlyEqual(float a, float b, float epsilon) {
final float absA = Math.abs(a);
final float absB = Math.abs(b);
final float diff = Math.abs(a - b);
if (a == b) { // shortcut, handles infinities
return true;
} else if (a == 0 || b == 0 || diff < Float.MIN_NORMAL) {
// a or b is zero or both are extremely close to it
// relative error is less meaningful here
return diff < (epsilon * Float.MIN_NORMAL);
} else { // use relative error
return diff / Math.min((absA + absB), Float.MAX_VALUE) < epsilon;
}
}
epsilon
的通用标准值是什么?例如,如果我想将其硬编码为任何人都可以用来比较任何值的 API?
最佳答案
epsilon 没有通用标准,因为它很大程度上取决于您要比较的内容和目的。每次测试两个 float 是否接近相等时,您需要考虑两件事:
- 这些数字的绝对值
- 它们代表的数量类型
例如,众所周知,PI 为“3.14 左右”,这对于大多数工程应用来说已经足够好了,但在数学或光谱分析(天文学)中,您需要更高的精度。
即使在同一域中,您比较的数字的绝对值也会影响您对 epsilon 的选择。比较以公里为单位的地球周长与 40_000.00
与以米为单位的月球距离与 384_400_000.00
的误差容忍度完全不同。
关于java - 哦,不,不再 - 比较两碗矮牵牛 - 对不起 - 漂浮,为了平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53449095/