询问2个双打是否不相等 - a!= b

时间:2011-12-10 14:13:41

标签: floating-point

我知道如果你想检查双打的相等性,你可以: return abs(a-b)<EPSILON

我的问题是:当我想询问a!=b时,是否需要与EPSILON进行比较? 我的直觉是肯定的(因为它们可能是平等的),但是从我在网上看到的它没有用EPSILON实现

还有一个问题,当我们想要检查双打或浮点数中的相等性时,我们使用EPSILON的原因是什么?

4 个答案:

答案 0 :(得分:3)

您使用epsilon,因为浮点数不是总是精确。您不能将1/3精确地表示为十进制数;你不能完全用二进制数表示0.1。

检查与epsilon的差异的绝对值是否足够;不需要任何其他东西。

我建议您阅读this

答案 1 :(得分:1)

比较两个双打的最常见方法可能是以下(C ++代码),因为在计算过程中你可能会因为取消引入错误,有限精度表示和其他(有关详细信息,请参阅What Every Computer Scientist Should Know About Floating-Point Arithmetic

#include <algorithm>
#include <cmath>
#include <limits>
bool almostEqual(double const a, double const b)
{
  double const diff = sta::abs(a - b);
  double const toll = std::max(std::abs(a), std::abs(b)) * 
                         std::numeric_limits<double>::epsilon();
  return diff < toll;
}

如果它们几乎不等于两个双打,那么a!=b变为!almostEqual(a,b)

答案 2 :(得分:0)

你没有拥有来检查那种方式是否相同。由于不精确的表示,累积精度误差等,你几乎肯定会想要。很好地讨论相对和绝对错误here

答案 3 :(得分:0)

检查浮点/双重等式:

abs(a - b) <= EPSILON

检查float / double in-equality:

abs(a - b) > EPSILON