使用C ++中的零初始化值进行浮动比较

时间:2018-04-14 09:13:43

标签: c++ floating-point floating-accuracy

使用' =='是否安全?运算符,以确定C ++中的双变量自初始化以来是否已更改为0.0?

出于性能原因,我想避免重新计算嵌套for循环中的值(如果已经计算过的话)。

如果认为不安全: 这是否会导致误报(即表达式返回true,尽管值不等于0.0),假阴性(即表达式返回false,尽管值确实为0.0)或两者/未确定的行为?

我正在使用C ++ - 14和GNU C ++编译器v5.4。

1 个答案:

答案 0 :(得分:3)

在C ++中,当且仅当x == 0.为零时,表达式x的计算结果为真。

您可能产生假阳性或假阴性的唯一意义是:

  • x是计算的结果,当理想的精确数学结果为非零时,产生零,反之亦然。换句话说,问题是x不包含您想要的值,而不是与零比较不能正常工作。
  • 而不是简单对象x,比较使用浮点表达式,如x/y == 0.中所示。 C ++允许以比标称类型更精确的方式计算表达式。当通过强制转换分配或转换值时,将丢弃此超出的精度。因此,比较可能表明表达式非零,即使将其指定给对象也会在对象中产生零。