我知道如果你想检查双打的相等性,你可以:
return abs(a-b)<EPSILON
我的问题是:当我想询问a!=b
时,是否需要与EPSILON进行比较?
我的直觉是肯定的(因为它们可能是平等的),但是从我在网上看到的它没有用EPSILON实现
还有一个问题,当我们想要检查双打或浮点数中的相等性时,我们使用EPSILON
的原因是什么?
答案 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