Is if(double)valid C++?

问题描述:

我只是碰到了这行代码:Is if(double)valid C++?

if(lineDirection.length2()){...} 

其中length2返回double。这有点令我困惑,0.0相当于0,NULL,和/或false

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

+1

还要注意NaN – 2010-09-22 08:55:39

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

$ 4.12/1 - “算术, 枚举,指针,或指针的右值到 成员类型可以转换为一个 右值的键入bool。零值, 空指针值或空成员 指针值转换为false; 任何其他值转换为true。

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

该行为是从C继承的,C以同样的方式处理等效比较。

当您比较没有运算符时,您正在比较“与真实”,以便每个变量类型被检查为布尔(简单情况)或其他。数字变量类型的虚假值被定义为“0”,“0.0”左右,所以当你比较它们“与真实”时,你的比较将返回false。

值得注意的是,这段代码对于浮点表示来说非常脆弱。当且仅当浮点值恰好为0时,此代码才能工作,在大多数情况下,这实际上不太可能。它可能不是在这种特殊情况下,但如果是这样的话,它肯定会被记录/评论。

在几乎所有其他情况下,您需要决定一个"epsilon value",它定义了您认为“相同”的浮点数的范围 - 否则您的比较很可能会让您在转角处(并且通常不是这样的转角)情况。

+3

+1指出代码的脆弱性。这可能会在很多情况下突破,这可能并不明显:double d = 0.0/-1.0;如果(d)'产生错误,则为'-0.0!= 0.0',并且对于可能产生足够接近'0'值而非完全**'0.0'的许多其他操作也是如此。 – 2010-09-22 07:48:28

+0

确定。可能代码“double x = 0.0; if(x){cout 2010-09-22 07:49:47

+3

@DavidRodríguez - dribeas:不,'-0.0 == 0.0',即使位模式不同。这非常重要。表达式'(x == 0.0 ||(1.0/x))'将不会评估'1.0/x',这将导致除以零。 – MSalters 2010-09-22 07:56:25

如果length2返回0.0,它将被视为false。但是通过这种比较你可能会得到令人惊讶的结果。像MadKeithV在浮点比较中所建议的那样更好地使用epsilon值。