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);
}

似乎在浪费处理。

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

最佳答案

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

我花了很长时间来跟踪假定为 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++ 运算符 == 产生正确的结果。)

就像我说的:这完全取决于上下文和 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/

相关文章:

c++ - 定义 BLECharacteristic 时 Genuino 101 不运行

c++ - 如何在C++中更改字符串中的字符

c++ - boost::posix_time::microsec_clock 以微秒分辨率加倍秒

c++ - MIT Introduction to C++ lecture notes 好吗?

string - 在两个大文件之间匹配字符串的算法

java - 如何优雅地以各种顺序调用方法?

algorithm - 高效的多选算法

c++ - 如何有效处理不同的概率分布函数?

algorithm - 逐像素贝塞尔曲线

.net - "Don' t 在这个热代码路径中使用 StringBuilder 或 foreach”