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

edA*_*a-y 17 c c++ language-lawyer

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

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

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

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

value == 0 ? false : true
value != 0 ? true : false
Run Code Online (Sandbox Code Playgroud)

现在,转换为整数怎么样?下面的简短程序显示转换为整数的变量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 );
}
Run Code Online (Sandbox Code Playgroud)

输出:

nan == -2147483648 == True
nan == 0 == True
Run Code Online (Sandbox Code Playgroud)

将NaN转换为零但将bool转换为True似乎令人不安.我也不是像MatLab这样的东西会使用像这样的函数将NaN转换为0 int16.

那么,相关标准的具体内容是说明NaN如何转换为布尔值和整数值?

我也在标记C,因为虽然它可能没有定义布尔转换,但它可能定义了一个整数转换并在条件中使用,我怀疑C++将遵循相同的规则

Mik*_*our 19

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

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

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

在这两种语言中,转换NANbool(或_Bool)给出true(或1):

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

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

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