众所周知,在比较浮点值时必须小心。通常,我们不使用==
,而是使用一些基于 epsilon 或 ULP 的相等性测试。
但是,我想知道,是否有任何情况下,使用时==
完全没问题?
看看这个简单的代码片段,哪些情况可以保证成功?
void fn(float a, float b) {
float l1 = a/b;
float l2 = a/b;
if (l1==l1) { } // case a)
if (l1==l2) { } // case b)
if (l1==a/b) { } // case c)
if (l1==5.0f/3.0f) { } // case d)
}
int main() {
fn(5.0f, 3.0f);
}
注意:我已经检查过this和this,但它们并未涵盖(所有)我的案例。
注意2:似乎我必须添加一些附加信息,因此答案在实践中可能很有用:我想知道:
- C++ 标准是怎么说的
- 如果 C++ 实现遵循 IEEE-754 会发生什么
这是我在当前标准草案中找到的唯一相关声明:
浮点类型的值表示是实现定义的。[注:本文档对浮点运算的准确性没有要求;另见 [support.limits]。——尾注]
那么,这是否意味着,即使是“案例 a)”也是实现定义的?我的意思是,l1==l1
绝对是浮点运算。那么,如果一个实现是“不准确的”,那么可能l1==l1
是错误的吗?
我认为这个问题不是Is floating-point == ever OK? . 这个问题没有解决我要问的任何情况。相同的主题,不同的问题。我想有专门针对案例 a)-d) 的答案,我无法在重复的问题中找到答案。