比较两个 double
或两个 float
值的最有效方法是什么?
简单地这样做是不正确的:
bool CompareDoubles1 (double A, double B)
{
return A == B;
}
但是像这样:
bool CompareDoubles2 (double A, double B)
{
diff = A - B;
return (diff < EPSILON) && (-diff < EPSILON);
}
似乎在浪费处理。
有人知道更智能的 float 比较器吗?
最佳答案
使用任何其他建议时要格外小心。这完全取决于上下文。
我花了很长时间来跟踪假定为 a==b
的系统中的错误。如果|a-b|<epsilon
.潜在的问题是:
算法中的隐式假设如果
a==b
和b==c
然后a==c
.对以英寸为单位测量的线和以密耳(0.001 英寸)为单位测量的线使用相同的 epsilon。即
a==b
但是1000a!=1000b
. (这就是为什么AlmostEqual2sComplement
要求提供 epsilon 或最大 ULPS 的原因)。角度的余弦和直线的长度使用相同的 epsilon!
使用这样的比较函数对集合中的项目进行排序。 (在这种情况下,使用内置 C++ 运算符
==
产生正确的结果。)
就像我说的:这完全取决于上下文和 a
的预期大小和 b
.
顺便说一下,std::numeric_limits<double>::epsilon()
是“机器epsilon”。这是1.0
之间的区别下一个值由 double 表示。我想它可以用在比较函数中,但前提是期望值小于 1。(这是对@cdv 的回答的回应...)
另外,如果你基本上有 int
算术 doubles
(这里我们在某些情况下使用 double 值来保存 int 值)你的算术是正确的。例如4.0/2.0
将与 1.0+1.0
相同.只要您不做会导致小数 (4.0/3.0
) 或不超出 int 大小的事情。
关于c++ - float 和双重比较最有效的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44819882/