比较两个的最有效方法是什么double
or two float
values?
简单地这样做是不正确的:
bool CompareDoubles1 (double A, double B)
{
return A == B;
}
但类似的东西:
bool CompareDoubles2 (double A, double B)
{
diff = A - B;
return (diff < EPSILON) && (-diff < EPSILON);
}
看来是废物处理。
有谁知道更智能的浮动比较器?
使用任何其他建议时要格外小心。这一切都取决于上下文。
我花了很长时间跟踪系统中的错误,假设a==b
if |a-b|<epsilon
。根本问题是:
-
算法中隐含的假设是,如果a==b
and b==c
then a==c
.
-
对以英寸为单位测量的线和以密耳(0.001 英寸)为单位测量的线使用相同的 epsilon。那是a==b
but 1000a!=1000b
。 (这就是为什么AlmostEqual2sComplement
要求 epsilon 或最大 ULPS)。
-
对角度的余弦和线的长度使用相同的 epsilon!
-
使用这样的比较函数对集合中的项目进行排序。 (在本例中使用内置的 C++ 运算符==
对于双打产生了正确的结果。)
就像我说的:这一切都取决于上下文和预期的规模a
and b
.
顺便一提,std::numeric_limits<double>::epsilon()
是“机器epsilon”。这是之间的区别1.0
以及由双精度值表示的下一个值。我猜想它可以在比较函数中使用,但前提是预期值小于 1。(这是对 @cdv 的回答的回应......)
另外,如果你基本上有int
算术中doubles
(在某些情况下,我们使用双精度数来保存 int 值)您的算术将是正确的。例如4.0/2.0
将与以下相同1.0+1.0
。只要你不做会导致分数的事情(4.0/3.0
) 或者不要超出 int 的大小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)