据我了解,必须仔细比较浮点类型的值,以避免固有浮点错误的问题。这可以通过将值与错误阈值进行比较来改进。
例如,以下解决方案比简单的解决方案更有用x == y
test:
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安全吗? https://stackoverflow.com/questions/6786254/is-it-safe-when-compare-2-float-double-directly-in-java/6786286#answer-6786580
虽然我还没有找到任何文献来证实这一点,但对我来说,这对于类似的比较来说似乎也是如此x > y
。例如,如果x
and 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;
}
我的假设正确吗?