if(double)是否有效的C++?

Vik*_*ehr 10 c++ floating-point implicit-conversion

我刚碰到这行代码:

if( lineDirection.length2() ){...}
Run Code Online (Sandbox Code Playgroud)

哪里length2返回一个double.让我感到困惑的是,0.0等于0 NULL,和/或false.

这是C++标准的一部分还是未定义的行为?

Chu*_*dad 10

这是一个非常标准的行为(布尔转换)

$ 4.12/1 - "算术,枚举,指针或指向成员类型的指针的rvalue可以转换为bool类型的rvalue.零值,空指针值或null成员指针值转换为false;任何其他值转换为真."


Jon*_*ler 6

是 - 比较为零(0.0),如果结果正好为零则返回false,否则返回true.

该行为继承自C,它以相同的方式处理等效比较.


Jor*_*ans 6

值得注意的是,此代码对于浮点表示非常脆弱.当且仅当浮点值正好为0时,此代码才有效,这在大多数情况下实际上是不太可能的.它可能不是在这种特殊情况下,但如果是这样的话,它当然应该被记录/评论.

在几乎所有其他情况下,您需要确定一个"epsilon值"来定义您认为"相同"的浮点数范围 - 否则您的比较很可能会让您在角落里感到惊讶(通常不是那么一角)案例.

  • @DavidRodríguez - dribeas:不,`-0.0 == 0.0`,即使位模式不同.这非常重要.表达式`(x == 0.0 ||(1.0/x))`将_not_评估`1.0/x`,这将导致除以零. (6认同)
  • +1表示代码的脆弱性.这将在许多可能不明显的条件下破裂:`double d = 0.0/-1.0; if(d)`yield false,as` -0.0!= 0.0`,对于许多其他可能产生足够接近'0'值的操作也是如此,这不是**正好**0.0 (3认同)
  • @DavidRodríguez-dribeas:确实令人惊讶,因为GNU文档提出相反的说法。参见http://www.gnu.org/s/libc/manual/html_node/Infinity-and-NaN.html(最后一行) (2认同)