在C+中与零初始化值进行浮点比较+; < P> >使用“=”操作符来确定C++中的双变量是否自初始化为0?时是否安全?

在C+中与零初始化值进行浮点比较+; < P> >使用“=”操作符来确定C++中的双变量是否自初始化为0?时是否安全?,c++,floating-point,floating-accuracy,C++,Floating Point,Floating Accuracy,出于性能原因,我希望避免在嵌套For循环中重新计算已经计算过的值 如果认为不安全: 这是否会导致误报(即,尽管值不等于0.0,但表达式返回true)、误报(即,尽管值确实为0.0,但表达式返回false)或两者兼而有之/未确定的行为 < >我使用C++ + 14和GNU C++编译器V5.4./P>< P> C++,表达式“代码> x==0。/COD>当且仅当 x为0时。 您可能出现假阳性或假阴性的唯一感觉是: x是理想精确数学结果为非零时产生零的计算结果,反之亦然。换句话说,问题在于x不包含

出于性能原因,我希望避免在嵌套For循环中重新计算已经计算过的值

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


< >我使用C++ + 14和GNU C++编译器V5.4./P>< P> C++,表达式“代码> x==0。/COD>当且仅当<代码> x<代码>为0时。 您可能出现假阳性或假阴性的唯一感觉是:

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

  • 在C++中,表达式<代码> x==0。< /> >当且仅当<代码> x>代码>为0时,计算为true。< /p> 您可能出现假阳性或假阴性的唯一感觉是:

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

    • 很重要的一点是,一旦你做了一些计算,浮点值几乎等于某个东西的可能性很小。“如果C++被改变为<代码> 3.1416 < /代码>,然后再设置为<代码> 0 <代码>,那么,如果确定C++中的双变量是否已经初始化为0?它已经改变了,但是它是
      ==0.0
      。然而,如果一个未触及的变量仅仅因为我在同一时间的某个地方使用了浮点运算而改变,这不是很奇怪吗?据我所知,0有一个精确的浮点表示,因此(0.0==0.0)可以预测为true。@Calyx是的,
      0.0
      是可以精确表示的值之一,因此比较是安全的。但是你不能断定初始化为
      0.0
      的东西没有被更改,因为不久之后它是
      ==0.0
      。为此,我使用初始化为
      NAN
      -0.0
      的技巧。非常相关:简言之,一旦你做了一些计算,一个浮点值几乎等于一个东西的可能性很小。“如果C++被改变为<代码> 3.1416 < /代码>,然后再设置为<代码> 0 <代码>,那么,确定C++中的双变量是否从初始化为0?它已经改变了,但是它是
      ==0.0
      。然而,如果一个未触及的变量仅仅因为我在同一时间的某个地方使用了浮点运算而改变,这不是很奇怪吗?据我所知,0有一个精确的浮点表示,因此(0.0==0.0)可以预测为true。@Calyx是的,
      0.0
      是可以精确表示的值之一,因此比较是安全的。但是你不能断定初始化为
      0.0
      的某个东西没有被更改,因为稍后它是
      ==0.0
      。为此,我使用了初始化为
      NAN
      -0.0
      的技巧。