C ++浮点数比较

时间:2019-07-07 00:52:06

标签: c++ double comparison precision

我想比较浮点数。比较相等时出现问题,因此我使用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);
}

它有效,但不适用于所有值。 有什么想法吗?

2 个答案:

答案 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。