C ++规范的哪一部分或IEEE浮点规范指出NaN值应该转换为true
而不是false?
如果我查看C ++标准部分 4.12布尔转换,它会说:
零值,空指针值或空成员指针值 转换为假;任何其他值都转换为true。
现在IEEE浮动说NaN将false与任何其他值进行比较。因此,NaN是真还是假取决于你如何进行比较(下图)。因此,我认为必须明确提及。
value == 0 ? false : true
value != 0 ? true : false
现在,转换为整数怎么样?下面的简短程序显示转换为整数的变量NAN产生最小整数,而常量转换为0(使用GCC)。这看起来很奇怪。
#include <iostream>
#include <cmath>
void write( double r, int i, bool b )
{
std::cout << r << " == " << i << " == " << (b ? "True" : "False") << std::endl;
}
int main()
{
double value = NAN;
write( value, value, value );
write( NAN, NAN, NAN );
}
输出:
nan == -2147483648 == True
nan == 0 == True
将NaN转换为零但是bool转换为True似乎令人不安。我也不是像MatLab这样的东西会使用类似int16
的函数将NaN转换为0。
那么,相关标准的具体内容是说明NaN如何转换为布尔值和整数值?
我也在标记C,因为虽然它可能没有定义布尔转换,但它可能定义了一个整数转换并在条件中使用,我怀疑C ++将遵循相同的规则
答案 0 :(得分:19)
在C和C ++中,将NAN
转换为整数类型(bool
除外)时,行为未定义:
C99 6.3.1.4/1:当实数浮点类型的有限值被转换为除
_Bool
以外的整数类型时,小数部分被丢弃(即,该值被截断为零)。如果整数部分的值不能用整数类型表示,行为未定义。C ++ 11 4.9 / 1:浮点类型的prvalue可以转换为整数类型的prvalue。转换截断;也就是说,丢弃小数部分。如果截断的值无法在目标类型中表示,则行为未定义。 [注意:如果目的地类型为
bool
,请参阅4.12。 -end note ]
在这两种语言中,将NAN
转换为bool
(或_Bool
)会产生true
(或1
):
C99 6.3.1.2/1:当任何标量值转换为
_Bool
时,如果值比较等于0,则结果为0;否则,结果是1。C ++ 11 4.12 / 1:零值,空指针值或空成员指针值转换为
false
;任何其他值都将转换为true
。
NAN
不是零值,并且不会等于零。