【发布时间】:2010-09-06 06:00:06
【问题描述】:
比较两个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);
}
似乎浪费了处理。
有人知道更智能的浮点比较器吗?
【问题讨论】:
-
> 在函数的开头添加 ... 会更有效吗?
<invoke Knuth>过早的优化是万恶之源。</invoke Knuth>上面提到的abs(a-b) -
原始发布者的实现唯一不理想的是它在 && 处包含一个额外的分支。 OJ 的答案是最佳的。 fabs 是一个内在函数,它是 x87 上的一条指令,我想几乎所有其他指令也是如此。已经接受 OJ 的回答了!
-
如果可以的话,放弃浮点数并使用定点数。例如,使用 {fixed point} 毫米而不是 {floating point} 米。
-
“仅仅这样做是不正确的” - 这只是垃圾,当然使用
==可能是完全正确的,但这完全取决于未给出的上下文这个问题。在知道上下文之前,==仍然是“最有效的方式”。
标签: c++ algorithm optimization floating-point