我想比较浮点数。比较相等时出现问题,因此我使用epsilon并解决了问题
inline bool isEqual(float x, float y)
{
const float epsilon = 1e-5;
return abs(x - y) <= epsilon * abs(x);
}
但是我也想比较其他比较,例如'>'和'<='
我有两个浮点数= 49,但是在执行f1 > f2
时返回true。
我已经尝试过此功能:
inline bool isSmallerOrEqual(float x, float y)
{
const float epsilon = 0.01;
return epsilon * abs(x) <= epsilon * abs(y);
}
它有效,但不适用于所有值。 有什么想法吗?
答案 0 :(得分:-1)
我试图通过for循环添加浮点值(都具有一种精度),然后将结果值与正常声明的浮点进行比较。但是我没有得到正确的答案。
我通过将浮点数乘以10并将其与value * 10进行比较,将浮点数转换为int来解决了这个问题
答案 1 :(得分:-1)
首先,您的isEquals
函数是错误的,您将epsilon乘以x
的绝对值没有任何意义。正确的版本应该是
static inline bool epsilonEquals(const float x, const float y, const float epsilon = 1E-5f)
{
return abs(x - y) <= epsilon;
}
其次,将其称为isEquals
是不准确的,该函数通常称为 Epsilon Equals ,因为它没有验证2个数字是否相等,而是验证了它们在合理范围内接近彼此在很小的误差范围内(ε)。
第三,如果要检查2个数字是否小于或等于2,则通常不需要甚至不希望包含epsilon equals函数,这样做只会增加假阳性的可能性。如果您想想要使用epsilon比较,则可以利用paulmckenzie的方法:
static inline bool epsilonLessThanOrEqualTo(const float x, const float y, const float epsilon = 1E-5f)
{
return x <= y || epsilonEquals(x, y, epsilon);
}
如果要使用epsilon不等于方法,则只需检查两个数字之间的绝对差是否大于epsilon。