From willemw@komp  Thu Sep  4 16:14:02 1997
Received: from komp.ace.nl (komp.ace.nl [193.78.104.90]) by dkuug.dk (8.6.12/8.6.12) with SMTP id QAA09227 for <sc22wg11@dkuug.dk>; Thu, 4 Sep 1997 16:14:02 +0200
Received: by komp.ace.nl with SMTP id AA27741 (1.14/2.17);
	  Thu, 4 Sep 97 16:12:03 +0200 (MET)
To: sc22wg11@dkuug.dk
Subject: WG11 N440 (3 of 7): LIA-1 binding for C: <stdlia.h>
Date: Thu, 04 Sep 97 16:12:02 N
Message-Id: <27739.873382322@komp>
From: Willem Wakker <willemw@komp.ace.nl>


*                          Document Number:  WG14 N749/J11 97-112


                               C9X Revision Proposal
                               =====================

*      Title: LIA-1 Binding: <stdlia.h>
       Author: Fred J. Tydeman
       Author Affiliation: Tydeman Consulting
       Postal Address: 3711 Del Robles Dr., Austin, Texas, USA, 78727
       E-mail Address: tydeman@tybor.com
       Telephone Number: +1 (512) 255-8696
       Fax Number: +1 (512) 255-8696
       Sponsor: WG14
       Date: 1997-08-25
       Proposal Category:
          __ Editorial change/non-normative contribution
          __ Correction
          Y_ New feature
          __ Addition to obsolescent feature list
          __ Addition to Future Directions
          __ Other (please specify)  ______________________________
       Area of Standard Affected:
          __ Environment
          __ Language
          __ Preprocessor
          Y_ Library
             Y_ Macro/typedef/tag name
             Y_ Function
             Y_ Header
          __ Other (please specify)  ______________________________
       Prior Art: None known.
       Target Audience: Programmers writing programs that perform a
       significant amount of numeric processing.___________________
       Related Documents (if any):
        WG14/N753 (LIA-1 Binding: Rationale),
        WG14/N752 (LIA-1 Binding: Optional parts annex),
        WG14/N751 (LIA-1 Binding: LIA-1 + IEC-559 annex),
        WG14/N750 (LIA-1 Binding: LIA-1 annex),
        WG14/N748 (LIA-1 Binding: Adding 'pole' from LIA-2),
        WG14/N747 (IEC 559 Binding: Signaling NaNs),
        WG14/N693 (Type-Generic Math Functions),
        WG14/N528 (C Binding of LIA-1),
        WG14/N487 (LIA-1), 
        WG14/N486 (LIA Overview), 
        WG14/N463 (Impact of adding LIA-1)
       Proposal Attached: _Y Yes __ No, but what's your interest?

       Abstract: These changes are the fundamental changes to C to
       allow support of ISO 10967-1 (LIA-1).  They are being added
       in their own header <stdlia.h>

       Proposal:

       Note: The '*' characters in the lefthand column are not part
       of the proposal (they are useful for emacs M-x outline mode)

       In the following, <B>bold text</B>, <I>italic text</I>,
       <TT>code sample</TT> are the conventions used to indicate
       text different from normal.

*      7 Library -- Add a new library section (here called 7.x)

**     7.x <stdlia.h> Notification and additional limits, mathematics,
       and general utilities.

       The header <stdlia.h> declares several macros and functions
       to support Language Independent Arithmetic.  These are
       additional limits (characteristics of the integer and
       floating-point types), general integer utilities,
       mathematical functions, notification and access to the
       integer environment.  The integer environment refers
       collectively to any integer status flags and control modes
       supported by the implementation[footnote].  An integer
       exception status flag is a system variable whose value is
       set as a side effect of the arithmetic to provide auxiliary
       information.  An integer control mode is a system variable
       whose value may be set by the user to affect the subsequent
       behavior of the arithmetic.

       [footnote].  This header is designed to support the
       notification indicators (here called exception status flags)
       required by LIA-1, and other similar integer state
       information.  Also it is designed to facilitate code
       portability among all systems.

***    7.x.1 Limits

       Several macros are declared to provide additional
       information beyond <B><limits.h></B> and <B><float.h></B>
       about the characteristics of the integer and floating-point
       types.

       All integral values in the <stdlia.h> header, shall be
       constant expressions suitable for use in #if preprocessing
       directives; all floating values shall be constant
       expressions.  All floating-point related macros have
       separate names for all three floating-point types.

****   7.x.1.1 Integer limits:

       The treatment of out-of-bounds results:

	   0   undefined behavior
	   1   wrap (similar to unsigned)
	   2   notification

       for the signed integer types <B>int</B>, <B>long</B> and
       <B>long long</B> are characterized by:

	   <B>INT_OUT_OF_BOUNDS</B>
	   <B>LONG_OUT_OF_BOUNDS</B>
	   <B>LLONG_OUT_OF_BOUNDS</B>

       respectively.

****   7.x.1.2 Floating-point limits:

       The level of support for subnormalized numbers is
       characterized by the values:

	  -1   indeterminable
	   0   not supported
	   1   fully supported
	   2   treated as zero

       for the floating types float, double, long double

	   <B>FLT_SUBNORMAL</B>
	   <B>DBL_SUBNORMAL</B>
	   <B>LDBL_SUBNORMAL</B>

       respectively.

       All other negative values for <B>*_SUBNORMAL</B>
       characterize implementation-defined behavior.

       The values given in the following list shall be replaced by
       implementation-defined expressions:

       -- boolean value (0 or 1) to indicate if the corresponding
       type conforms to IEC 559.

           <B>FLT_IEC_559</B>
           <B>DBL_IEC_559</B>
           <B>LDBL_IEC_559</B>


       -- boolean value (0 or 1) to indicate if IEC 559 tininess is
       detected "before rounding" (1) or "after rounding" (0).

           <B>TINYNESS_BEFORE</B>


       -- boolean value (0 or 1) to indicate if IEC 559
       loss-of-accuracy is detected as a denormalization loss (1)
       or as an inexact result (0).

           <B>HAS_DENORM_LOSS</B>


       -- boolean value (0 or 1) to indicate if LIA-1 strict 1-ulp
       accuracy and a common rounding rule for +, -, *, and / is
       used.

           <B>LIA_STRICT</B>


       -- boolean value (0 or 1) to indicate if underflows are
       silent (do not produce a notification)

           <B>SILENT_UNDERFLOW</B>


       -- boolean value (0 or 1) to indicate if comparisons may
       overflow or underflow like subtraction

           <B>COMPARISON_VIA_SUBTRACT</B>


       -- boolean value (0 or 1) to indicate if negate may fail
       because floating-point values are not sign symmetric.

           <B>NEGATE_MAY_FAIL</B>


       The values given in the following list shall be replaced by
       implementation-defined expressions that shall be equal or
       greater in magnitude (absolute value) to those shown, with
       the same sign:

       -- minimum positive floating-point number, b**emin-p if
       subnormalized numbers are supported, else b**emin-1.

           <B>FLT_TRUE_MIN</B>   1E-37
           <B>DBL_TRUE_MIN</B>   1E-37
           <B>LDBL_TRUE_MIN</B>  1E-37


       The values given in the following list shall be replaced by
       implementation-defined expressions that shall be equal or
       lesser in magnitude (absolute value) to those shown, with
       the same sign:

       -- maximum rounding error in terms of Units in Last Place
       (ULPs),

           <B>FLT_RND_ERR</B>   1.5
           <B>DBL_RND_ERR</B>   1.5
           <B>LDBL_RND_ERR</B>  1.5

       Example 2 in <B><float.h></B> is supplemented with these:

           <B>FLT_IEC_559</B>    1
           <B>FLT_SUBNORMAL</B>  1
           <B>FLT_TRUE_MIN</B>   1.40129846E-45
           <B>FLT_RND_ERR</B>    0.5
           <B>DBL_IEC_559</B>    1
           <B>DBL_SUBNORMAL</B>  1
           <B>DBL_TRUE_MIN</B>   4.94065646E-324
           <B>DBL_RND_ERR</B>    0.5


***    7.x.2 Mathematics:

       Several functions are declared to provide additional
       capability beyond <B><math.h></B>.  Most synopses specify a
       function which takes one or more <B>double</B> arguments and
       returns a <B>double</B> value; for each such function, there
       are functions with the same name but with <B>f</B> and
       <B>l</B> suffixes which are corresponding functions with
       <B>float</B> and <B>long double</B> arguments and return
       values.

****   7.x.2.1 Exponential and logarithmic functions

*****  <B>7.x.2.1.1 The fracrep function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>double fracrep(double x);</B>

       <B>Description</B>

       The <B>fracrep</B> function extracts the fraction of the
       model representation of <B>x</B>, as a signed normalized
       fraction in the format of <B>x</B>.

       <B>Returns</B>

       The <B>fracrep</B> function returns the value <B>y</B>, such
       that <B>y</B> is a <B>double</B> with magnitude in the
       interval [1/<B>FLT_RADIX</B>, 1) or zero, and <B>x</B> equals
       <B>y</B> times <B>FLT_RADIX</B> raised to the power
       (<B>logb(x)+1.0</B>).  The value returned for zero is 0.0.


*****  <B>7.x.2.1.2 The ulp function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>double ulp(double x);</B>

       <B>Description</B>

       The <B>ulp</B> function computes the value of a Unit in the
       Last Place of <B>x</B>.  A domain error occurs if the
       argument is zero.  A range error may occur if subnormals are
       not supported.

       <B>Returns</B>

       The <B>ulp</B> function returns the value <B>FLT_RADIX</B>
       raised to the power (<B>logb(x)+1-<I>p</I></B>).  <I>p</I>
       is the precision of the floating type and is one of
       *_MANT_DIG.

****   7.x.2.2 Sign function

*****  <B>7.x.2.2.1 The fsgn function</B>

       <B>Synopsis</B>

            <B>#include <stdlia.h></B>
            <B>double fsgn(double x);</B>

       <B>Description</B>

       The <B>fsgn</B> function computes the sign of a
       floating-point number <B>x</B>.  Positive floating-point
       numbers have a sign of +1.0, negative floating-point numbers
       have a sign of -1.0, and zero has a sign of 0.0.

       <B>Returns</B>

       The <B>fsgn</B> function returns the sign.

****   7.x.2.3 Manipulation functions:

*****  <B>7.x.2.3.1 The fsucc function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>double fsucc(double x);</B>

       <B>Description</B>

       The <B>fsucc</B> function determines the next representable
       value, in the type of the function, after <B>x</B> in the
       direction of +infinity.  A range error occurs if <B>x</B> is
       the largest positive finite number.

       <B>Returns</B>

       The <B>fsucc</B> function returns the smallest representable
       value, of the same type, greater than <B>x</B>.


*****  <B>7.x.2.3.2 The fpred function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>double fpred(double x);</B>

       <B>Description</B>

       The <B>fpred</B> function determines the next representable
       value, in the type of the function, after <B>x</B> in the
       direction of -infinity.  A range error occurs if <B>x</B> is
       the largest negative finite number.

       <B>Returns</B>

       The <B>fpred</B> function returns the largest representable
       value, of the same type, less than <B>x</B>.


*****  <B>7.x.2.3.3 The truncto function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>double truncto(double x, int n);</B>

       <B>Description</B>

       The <B>truncto</B> function truncates (rounds toward zero)
       <B>x</B> to <B>n</B> digits of precision.

       <B>Returns</B>

       The <B>truncto</B> function returns the value for normal
       numbers: sign(x) * floor(|x|/(FLT_RADIX**(expon(x)-n))) *
       FLT_RADIX**(expon(x)-n) and for subnormal numbers: sign(x) *
       floor(|x|/(FLT_RADIX**(emin-n))) * FLT_RADIX**(emin-n).  If
       <B>n</B> is less than 1, returns 0.  If <B>n</B> is greater
       than precision of <B>x</B>, returns <B>x</B>.


*****  <B>7.x.2.3.4 The roundto function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>double roundto(double x, int n);</B>

       <B>Description</B>

       The <B>roundto</B> function rounds (rounds to biased nearest
       with ties going away from zero) <B>x</B> to <B>n</B> digits
       of precision.  A range error may occur.

       <B>Returns</B>

       The <B>roundto</B> function returns the value for normal
       numbers: sign(x) * floor(|x|/(FLT_RADIX**(expon(x)-n))+0.5)
       * FLT_RADIX**(expon(x)-n) and for subnormal numbers: sign(x)
       * floor(|x|/(FLT_RADIX**(emin-n))+0.5) * FLT_RADIX**(emin-n).
       If <B>n</B> is less than 1, returns 0.  If <B>n</B> is
       greater than precision of <B>x</B>, returns <B>x</B>.


****   <B>7.x.2.4 Conversion macros:</B>

       The following subclauses provide macros that convert from
       floating-point type to integral type using round to nearest
       rounding.  The round to nearest can be biased (ties round
       away from zero) or unbiased (such as IEC 559 round to
       nearest even).  In the synopses in this subclause,
       real-floating indicates that the argument must be an
       expression of real floating type.

*****  <B>7.x.2.4.1 The icvt macro</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>int icvt(real-floating x);</B>

       <B>Description</B>

       The <B>icvt</B> macro rounds its argument to the nearest
       integral value.  If the rounded value is outside the range
       of <B>int</B>, the numeric result is unspecified.  A range
       error may occur if the magnitude of x is too large.

       <B>Returns</B>

       The <B>icvt</B> macro returns the rounded integral value.

*****  <B>7.x.2.4.2 The lcvt macro</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>long lcvt(real-floating x);</B>

       <B>Description</B>

       The <B>lcvt</B> macro is equivalent to the <B>icvt</B>
       macro, except that the returned value has type <B>long</B>.

*****  <B>7.x.2.4.3 The llcvt macro</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>long long llcvt(real-floating x);</B>

       <B>Description</B>

       The <B>llcvt</B> macro is equivalent to the <B>icvt</B>
       macro, except that the returned value has type <B>long
       long</B>.

*****  <B>7.x.2.4.4 The uicvt macro</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>unsigned int uicvt(real-floating x);</B>

       <B>Description</B>

       The <B>uicvt</B> macro rounds its argument to the nearest
       integral value.  If the rounded value is outside the range
       of <B>unsigned int</B>, the rounded value is wrapped modulo
       (<B>UINT_MAX+1</B>).

       <B>Returns</B>

       The <B>uicvt</B> macro returns the rounded integral value.

*****  <B>7.x.2.4.5 The ulcvt macro</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>unsigned long ulcvt(real-floating x);</B>

       <B>Description</B>

       The <B>ulcvt</B> macro is equivalent to the <B>uicvt</B>
       macro, except that the returned value has type <B>unsigned
       long</B>.

*****  <B>7.x.2.4.6 The ullcvt macro</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>unsigned long long ullcvt(real-floating x);</B>

       <B>Description</B>

       The <B>ullcvt</B> macro is equivalent to the <B>uicvt</B>
       macro, except that the returned value has type <B>unsigned
       long long</B>.


***    7.x.3 General utilities 

Several functions are declared to provide additional
capability beyond <B><stdlib.h></B>.

****   <B>7.x.3.1 The sgn function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>int sgn(int j);</B>

       <B>Description</B>

       The <B>sgn</B> function computes the sign of an integer
       <B>j</B>.  Positive integers have a sign of +1, negative
       integers have a sign of -1, and zero has a sign of 0.

       <B>Returns</B>

       The <B>sgn</B> function returns the sign.


****   <B>7.x.3.2 The lsgn function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>long int lsgn(long int j);</B>

       <B>Description</B>

       The <B>lsgn</B> function is similar to the <B>sgn</B>
       function, except that the argument and returned value each
       have type <B>long int</B>.


****   <B>7.x.3.3 The llsgn function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>long long int llsgn(long long int j);</B>

       <B>Description</B>

       The <B>llsgn</B> function is similar to the <B>sgn</B>
       function, except that the argument and returned value each
       have type <B>long long int</B>.


****   <B>7.x.3.4 The modulo function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>int modulo(int numer, int denom);</B>

       <B>Description</B>

       The <B>modulo</B> function computes the modulus, that is,
       <B>numer-(floor(numer/denom)*denom)</B>.  If <B>denom</B> is
       zero, the behavior is undefined.

       <B>Returns</B>

       The <B>modulo</B> function returns the modulus.


****   <B>7.x.3.5 The lmodulo function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>long int lmodulo(long int numer, long int denom);</B>

       <B>Description</B>

       The <B>lmodulo</B> function is similar to the <B>modulo</B>
       function, except that the arguments and returned value each
       have type <B>long int</B>.


****   <B>7.x.3.6 The llmodulo function</B>

       <B>Synopsis</B>

           <B>#include <stdlia.h></B>
           <B>long long int llmodulo(long long int numer,
                                     long long int denom);</B>

       <B>Description</B>

       The <B>llmodulo</B> function is similar to the <B>modulo</B>
       function, except that the arguments and returned value each
       have type <B>long long int</B>.


***    7.x.4 Notification

       Each macro

           <B>INT_OVERFLOW</B>
           <B>INT_DIVBYZERO</B>
           <B>INT_INVALID</B>

       is defined if and only if the implementation supports the
       exception by means of the functions in 7.x.4.2. The defined
       macros expand to integral constant expressions whose values
       are distinct powers of 2.

****   7.x.4.1 The LIA_NOTIFY pragma and macro

*****  7.x.4.1.1 The LIA_NOTIFY pragma

       Synopsis

           #include <stdlia.h>
           #pragma STDC LIA_NOTIFY { UNDEF | IGNORE | FLAGS | TRAP }

       Description

       The LIA_NOTIFY pragma provides a means to inform the
       implementation which notification mechanism is to be
       used[footnote].  The pragma can occur either outside
       external declarations or preceding all explicit declarations
       and statements inside a compound statement.  When outside
       external declarations, the pragma takes effect from its
       occurrence until another LIA_NOTIFY pragma is encountered,
       or until the end of the translation unit.  When inside a
       compound statement, the pragma takes effect from its
       occurrence until another LIA_NOTIFY pragma is encountered
       (within a nested compound statement), or until the end of
       the compound statement; at the end of a compound statement
       the state for the pragma is restored to its condition just
       before the compound statement.  The effect of this pragma in
       any other context is undefined.  If part of a program tests
       flags or runs under non-default mode settings, but was
       translated with the state for the LIA_NOTIFY pragma UNDEF,
       then the behavior of that program is undefined.  

       UNDEF means that the program wishes notifications to cause
       undefined behaviour.  This matches C89. This mode does not
       conform to LIA-1.

       IGNORE means that the program wishes notifications to be
       ignored.  This also causes the final check on the
       notification indicators at program termination to be
       suppressed.  This allows the optimizations mentioned in the
       subsection on "FENV_ACCESS off" to be done.  This mode does
       not conform to LIA-1.

       FLAGS means that the program wishes notifications to cause
       set a status flag.

       TRAP means that the program wishes notifications to cause
       a trap, that is signal SIGFPE.

       Until <stdlia.h> is included, the default state for the
       pragma shall be UNDEF.  Once <stdlia.h> is included, the
       default state for the pragma is implementation-defined and
       shall be one of FLAGS, TRAP, (or DYNAMIC if supported).

       [footnote]Notification is the process by which a program is
       informed that an arithmetic operation cannot be performed.

*****  7.x.4.1.2 The LIA_NOTIFY macro

       The macro LIA_NOTIFY has one of these values (with
       corresponding meaning):

        0 Undefined, like C89/C95; not LIA-1 compliant
        1 Notifications are ignored; not LIA-1 compliant
        2 All notifications will set flags
        3 All notifications will trap
        4 Program switches between flags and traps at runtime

       to indicate the current way notifications are being handled.
       That is, the macro tracks the state of the LIA_NOTIFY
       pragma.

****   7.x.4.2 Indicators or Exception flags

       The following functions provide access to the integer
       exception flags.  They support the basic abstraction of
       flags that are either set or clear.  The <B>int</B> input
       argument for the functions represents a subset of integer
       exceptions, and can be constructed by bitwise ORs of the
       exception macros, for example INT_DIVBYZERO | INT_INVALID.
       For other argument values the behavior of these functions is
       undefined.


*****  7.x.4.2.1 The ieclearexcept function

       Synopsis

           #include <stdlia.h>
           void ieclearexcept(int excepts);

       Description

       The ieclearexcept function clears the supported exceptions
       represented by its argument.

*****  7.x.4.2.2 The ieraiseexcept function

       Synopsis

           #include <stdlia.h>
           void ieraiseexcept(int excepts);

       Description

       The ieraiseexcept function raises the supported exceptions
       represented by its argument.  The order in which these
       exceptions are raised is unspecified.

*****  7.x.4.2.3 The ietestexcept function

       Synopsis

           #include <stdlia.h>
           int ietestexcept(int excepts);

       Description

       The ietestexcept function determines which of a specified
       subset of the exception flags are currently set.  The
       excepts argument specifies the exception flags to be
       queried.[footnote]

       [footnote].  This mechanism allows testing several
       exceptions with just one function call.

       Returns

       The ietestexcept function returns the value of the bitwise
       OR of the exception macros corresponding to the currently
       set exceptions included in excepts.


*      -- Add to 7.? Type-generic math <tgmath.h>:
       <stdlia.h> after all occurances of <math.h>

**     -- Add to 7.?.1 Type-generic macros
***    -- Add to the list of real (but not complex) functions that
       starts atan2, exp2:

           <B>fracrep</B>
           <B>ulp</B>
           <B>fsgn</B>
           <B>fsucc</B>
           <B>fpred</B>
           <B>truncto</B>
           <B>roundto</B>


*      -- Add to Annex F IEC 559 Floating-Point Arithmetic:
**     -- Add new subclause F.10 <stdlia.h>:
***    F.10.1 Exponential and logarithmic functions

****   F.10.1.1 The fracrep function

           fracrep(-0.0) returns -0.0
           fracrep(+/-INFINITY) returns +/-INFINITY

****   F.10.1.2 The ulp function

           ulp(-0.0) returns a NaN and raises the invalid
               exception.
           ulp(+/-INFINITY) returns a NaN and raises the invalid
               exception.
           ulp(1.0) returns DBL_EPSILON.

***    F.10.2 Sign function

****   F.10.2.1 The fsgn function

           fsgn(-0.0) returns -0.0
           fsgn(+INFINITY) returns +1.0
           fsgn(-INFINITY) returns -1.0
           fsgn(NaN) returns the same NaN.

***    F.10.3 Manipulation functions

****   F.10.3.1 The fsucc function

           fsucc(-0.0) returns +DBL_TRUE_MIN
           fsucc(+INFINITY) returns +INFINITY
           fsucc(+DBL_MAX) returns +INFINITY and raises overflow.

****   F.10.3.2 The fpred function

           fpred(-0.0) returns -DBL_TRUE_MIN
           fpred(-INFINITY) returns -INFINITY
           fpred(-DBL_MAX) returns -INFINITY and raises overflow.

****   F.10.3.3 The truncto function

           truncto(-0.0, n) returns -0.0 for any n.
           truncto(+/-INFINITY, n) returns +/-INFINITY for any n.
           truncto(NaN, n) returns the same NaN for any n.

****   F.10.3.4 The roundto function

           roundto(-0.0, n) returns -0.0 for any n.
           roundto(+/-INFINITY, n) returns +/-INFINITY for any n.
           roundto(NaN, n) returns the same NaN for any n.

***    F.10.4 Conversion macros

****   F.10.4.1 The icvt macro

           icvt(+/-INFINITY) returns an unspecified value and
               raises INT_INVALID.
           icvt(NaN) returns an unspecified value and raises
               INT_INVALID.

****   F.10.4.2 The lcvt macro

           lcvt(+/-INFINITY) returns an unspecified value and
               raises INT_INVALID.
           lcvt(NaN) returns an unspecified value and raises
               INT_INVALID.

****   F.10.4.3 The llcvt macro

           llcvt(+/-INFINITY) returns an unspecified value and
               raises INT_INVALID.
           llcvt(NaN) returns an unspecified value and raises
               INT_INVALID.

****   F.10.4.4 The uicvt macro

           uicvt(+/-INFINITY) returns an unspecified value and
               raises INT_INVALID.
           uicvt(NaN) returns an unspecified value and raises
               INT_INVALID.

****   F.10.4.5 The ulcvt macro

           ulcvt(+/-INFINITY) returns an unspecified value and
               raises INT_INVALID.
           ulcvt(NaN) returns an unspecified value and raises
               INT_INVALID.

****   F.10.4.6 The ullcvt macro

           ullcvt(+/-INFINITY) returns an unspecified value and
               raises INT_INVALID.
           ullcvt(NaN) returns an unspecified value and raises
               INT_INVALID.

- ---
Fred J. Tydeman    +1 (512) 255-8696   Tydeman Consulting
3711 Del Robles    tydeman@tybor.com   Programming, testing, numerics
Austin, Texas 78727                    Voting member of X3J11 (ANSI "C")
USA            Sample C9X+FPCE tests:  ftp://jump.net/pub/tybor/
