gpt4 book ai didi

c++ - float 和双重比较最有效的方法是什么?

转载 作者:bug小助手 更新时间:2023-10-28 01:30:38 24 4
gpt4 key购买 nike

比较两个 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);
}

似乎浪费了处理。

有人知道更智能的浮点比较器吗?

最佳答案

使用任何其他建议时要格外小心。这一切都取决于上下文。

我花了很长时间跟踪假定 a==b 的系统中的错误。如果 |a-b|<epsilon .根本问题是:

  1. 算法中的隐含假设,如果 a==bb==c然后 a==c .

  2. 对以英寸为单位的线和以密耳(0.001 英寸)为单位的线使用相同的 epsilon。即a==b但是 1000a!=1000b . (这就是 AlmostEqual2sComplement 要求 epsilon 或最大 ULPS 的原因。

  3. 角度的余弦和线的长度使用相同的 epsilon!

  4. 使用这样的比较函数对集合中的项目进行排序。 (在这种情况下,使用内置 C++ 运算符 == 进行 double 运算会产生正确的结果。)

就像我说的:这完全取决于上下文和 a 的预期大小和 b .

顺便说一句,std::numeric_limits<double>::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/17333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com