NaN对Bool的转换:对还是错?

C ++规范的哪一部分或IEEE浮点规范声明NaN值应该转换为true而不是false?

如果我查看C ++标准部分4.12布尔转换它说:

零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true。

现在IEEE浮动说NaN将false与任何其他值进行比较。 因此NaN是真还是假取决于你如何进行比较(见下文)。 因此,我认为必须明确提及。

 value == 0 ? false : true value != 0 ? true : false 

现在,转换为整数怎么样? 下面的简短程序显示转换为整数的变量NAN导致最小整数,而常量转换为0(使用GCC)。 这看起来很奇怪。

 #include  #include  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 ++将遵循相同的规则

在C和C ++中,将NAN转换为整数类型( bool除外)时,行为未定义:

C99 6.3.1.4/1:当实数浮点类型的有限值转换为_Bool以外的整数类型时,小数部分被丢弃(即,该值被截断为零)。 如果整数部分的值不能用整数类型表示, 则行为是未定义的

C ++ 11 4.9 / 1:浮点类型的prvalue可以转换为整数类型的prvalue。 转换截断; 也就是说,分数部分被丢弃。 如果截断的值无法在目标类型中表示,则行为未定义 。 [ 注意:如果目的地类型是bool ,请参阅4.12。 – 尾注 ]

在这两种语言中,将NAN转换为bool (或_Bool )给出true (或1 ):

C99 6.3.1.2/1:当任何标量值转换为_Bool ,如果值比较等于0,则结果为0; 否则,结果为1。

C ++ 11 4.12 / 1:零值,空指针值或空成员指针值转换为false ; 任何其他值都转换为true

NAN不是零值,并且不比较等于零。