What part of the C++ spec, or the IEEE float spec, states that a NaN value should convert to true
as opposed to false?
If I look at the C++ standard section
In both C and C++, the behaviour is undefined when converting NAN
to an integer type (other than bool
):
C99 6.3.1.4/1: When a finite value of real floating type is converted to an integer type other than
_Bool
, the fractional part is discarded (i.e., the value is truncated toward zero). If the value of the integral part cannot be represented by the integer type, the behavior is undefined.C++11 4.9/1: A prvalue of a floating point type can be converted to a prvalue of an integer type. The conversion truncates; that is, the fractional part is discarded. The behavior is undefined if the truncated value cannot be represented in the destination type. [ Note: If the destination type is
bool
, see 4.12. —end note ]
In both languages, converting NAN
to bool
(or _Bool
) gives true
(or 1
):
C99 6.3.1.2/1: When any scalar value is converted to
_Bool
, the result is 0 if the value compares equal to 0; otherwise, the result is 1.C++11 4.12/1: A zero value, null pointer value, or null member pointer value is converted to
false
; any other value is converted totrue
.
NAN
is not a zero value, and doesn't compare equal to zero.