据我了解,必须仔细比较浮点类型的值,以避免固有浮点错误的问题。这可以通过将值与错误阈值进行比较来改善。
例如,以下解决方案比简单的x == y
测试更有用:
static float CompareRelativeError(float x, float y) {
return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y));
}
static bool CompareAlmostEqual(float x, float y, float delta) {
return x == y || CompareRelativeError(x, y) < delta;
}
// apologies if this is a poor example
if (CompareAlmostEqual(1f/10f, 0.1f)) { ... }
上述解决方案源自以下资源: 在 Java 中直接比较 2 float/double 是否安全?
虽然我无法找到任何文献来证实这一点,但在我看来,对于像x > y
. 例如,如果x
和y
本质上相等,那么一个怎么可能大于另一个...
static bool CompareGreater(float x, float y, float delta) {
return x > y && !CompareAlmostEqual(x, y, delta);
}
因此以下内容适用于x >= y
:
static bool CompareGreaterOrEqual(float x, float y) {
return x >= y;
}
我的假设正确吗?