据我所知,浮点类型的值必须仔细比较以避免固有浮点错误的问题。通过比较值和错误阈值可以改善这一点。比较float和double值与delta吗?
例如,下面的解决方案比一个简单的测试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)) { ... }
将上述溶液从下面的资源衍生的: Is it safe when compare 2 float/double directly in Java?
虽然我还没有能找到任何文学来证实这一点,对我来说,似乎相同必须适用于比较,如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;
}
是我的假设是否正确?
可能重复[Doub le.Epsilon for equal,大于,小于,小于或等于,大于或等于](http://stackoverflow.com/questions/2411392/double-epsilon-for-equality-greater-thanless - 小于或等于gre) – 2013-02-13 01:02:27