ISO/ IEC JTC1/SC22/WG14 N819

   WG14/N819	  98-018
   
   What is meant by: Support for NaNs?
   
   
   I suggest that we add to C9X draft standard in 7.7
   Mathematics <math.h> after the paragraph that defines the
   NAN macro:
   
     An implementation supports quiet NaNs if its NaNs have the
     same behaviour as IEC-559 quiet NaNs for all floating types. 
   
   
   Add to the Rationale in section 7.7:
   
     NaNs have the following propertities:
   
     Every floating-point arithmetic operation that delivers a
     floating-point result that has one or more NaN operands,
     shall deliver a quiet NaN result, which should be one of
     the input NaNs, and signal no exception.  Note, format
     conversions between floating-point types might be unable
     to deliver the same NaN. 
   
     The comparison operators ( <, <=, >, and >= ) involving
     one or two input NaNs, shall signal the invalid exception
     and deliver 0 as the result.
   
     The equality operators ( == and != ) involving one or two
     input NaNs shall raise no exceptions; the result of ==
     shall be 0 and of != shall be 1. 
   
     The comparison macros ( isgreater, isgreaterequal, isless,
     islessequal, islessgreater, and isunordered ), new with
     C9X, are meant for programs that care about NaNs.  They
     are similar to the existing comparison operators, but do
     not raise invalid for NaN operands. 
   
     Every conversion from floating-point to integer that has a
     NaN operand shall raise invalid and the resulting value is
     unspecified. 
   
     Conversion of NaNs to decimal strings is specified by
     printf().  Conversion of NaN decimal strings to floating
     is specified by strtod(). 
   
     For functions that deliver floating results from floating
     arguments, unless specified otherwise:
   
       One-parameter functions of a NaN argument return that same
       NaN and raise no exception. 
     
       Two or more parameter functions with one NaN argument
       return that same NaN and raise no exception. 
     
       Two or more parameter functions with two or more NaN
       arguments return a NaN results (which should be one of the
       arguments) and raise no exception. 
   
   
   ---------- end of suggested changes.
   
   The terms NaN and supported are used several places in the
   C9X draft.  Some of them are:
   
   5.2.4.2.2 Characteristics of floating types <float.h> has:
   
   A NaN is an encoding signifying Not-a-Number.  A quiet
   NaN propagates through almost every arithmetic operation
   without raising an exception; a signaling NaN generally
   raises an exception when ocurring as an arithmetic
   operand.17
   
   Footnote 17: IEC 559 specifies quiet and signaling NaNs. 
   For implementations that do not support IEC 559, the terms
   quiet NaN and signaling NaN are intended to apply to
   encodings with similar behavior.
   
   6.2.1.4 Real floating types has:
   
   "When a float is promoted to double or long double,
   or a double is promoted to long double, its value
   is unchanged."
   
   7.7 Mathematics <math.h> has:
   
   The macro NAN is defined if and only if the implementation
   supports quiet NaNs for the float type.
    
   7.7.3.5 isnan:
   
   Footnote 176.  For the isnan macro, the type for
   determination doesn't matter unless the implementation
   supports NaNs in the evaluation type but not in the
   semantic type. 
   
   7.7.11.2 The nan function currently has: 
   
   If the implementation does not support quiet NaNs for the
   double type, a call to the nan function is unspecified. 
   
   7.7.12.2: fmax/fmin:
   
   Footnote 182.  NaN arguments are treated as missing data:
   if one argument is a NaN and the other numeric, then fmax
   chooses the numeric value.  See F.9.9.2. 
   
   Footnote 183.  fmin is analogous to fmax in its treatment
   of NaNs. 
   
   
   7.7.14 Comparison macros
   
   The relational and equality operators support the usual
   mathematical relationships between numeric values.  For
   any ordered pair of numeric values exactly one of the
   relationships - less, greater, and equal - is true. 
   Relational operators may raise the invalid exception when
   argument values are NaNs.  For a NaN and a numeric value,
   or for two NaNs, just the unordered relationship is
   true.184 The following subclauses provide macros that are
   quiet (non exception raising) versions of the relational
   operators, and other comparison macros that facilitate
   writing efficient code that accounts for NaNs without
   suffering the invalid exception.  In the synopses in this
   subclause, real-floating indicates that the argument must
   be an expression of real floating type. 
   
   Footnote 184.  IEC 559 requires that the built-in
   relational operators raise the invalid exception if the
   operands compare unordered, as an error indicator for
   programs written without consideration of NaNs; the result
   in these cases is false. 
   
   F.2.1 Infinities, signed zeros, and NaNs
   
   This specification does not define the behavior of
   signaling NaNs.274 It generally uses the term NaN to
   denote quiet NaNs.  The NAN and INFINITY macros and the
   nan function in <math.h> provide designations for IEC 559
   NaNs and infinities.