据我了解,为避免固有的浮点误差问题,必须仔细比较浮点类型的值。通过使用误差阈值来比较值可以改善这种情况。
例如,以下解决方案比直接使用 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中直接比较两个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;
}
我的假设正确吗?