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

标签 c++ algorithm optimization floating-point

比较两个 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()是“机器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/36610000/

相关文章:

c++ - 将包含 int 的字符串读取到数组的最快方法是什么

javascript - 强制 JavaScript 每天重新加载一次

c++ - 头文件没有给函数声明

c - 设计一个 O(N) 算法找到 1's from a 2D matrix[N][N] containing 1' s 和 0 的数量

algorithm - 打印所有排列的最快运行时间

algorithm - 证明logn是O(2^sqrt(logn))

javascript - 是否可以指示浏览器首先绘制页面的哪些元素?

c++ - 如何使用 std::bind 编译 C++ 程序?

c++ - 如何使用 RSA/AES 加密/解密较大的文件

c++ - 类类型转换 - 运算符 + 不明确