Re: reading NaNs Aubrey Jaffer 29 Oct 2005 19:10 UTC

 | Date: Thu, 27 Oct 2005 13:00:02 -0700
 | From: Alan Watson <xxxxxx@astrosmo.unam.mx>
 | ...
 |
 | I do think your suggestion of context is a good one, provided it is
 | optional and does not interfere with bit patterns. It can be
 | accomodated by:
 |
 | (a) "write" writes NaNs with a bit pattern and a possible context
 | (for example, #<NaN #x12345ef expt>). If the implementation does
 | not support context or if the NaN is not associated with any
 | context, "write" omits it (for example, #<NaN #x12345ef>).
 |
 | (b) "display" writes NaNs without a bit pattern but with a possible
 | context (for example, #<NaN expt>). If the implementation does not
 | support context or if the NaN is not associated with any context,
 | "display" omits it (for example, #<NaN>).
 |
 | (c) If a bit pattern is present, "read" produces a NaN with the
 | same bit patterm. This maintains read/write equivalence.
 |
 | (d) If no bit pattern is present, but a context is present, and if
 | the implementation supports contexts, then "read" produces a NaN
 | with the same context. This may be a different bit pattern as the
 | reading and writing implementations may encode the context
 | differently.
 |
 | (e) If neither a bit pattern nor a context is present, "read"
 | produces a contextless NaN.
 |
 | Basically, write/read would preserve bit patterns and display/read
 | would attempt to preserve context.  What do you think?

It looks a reasonable system for read/write invariance.

I think there is a practical problem with "designer-NaNs" in that,
unlike all other IEEE-754 number objects, they cannot be constructed
by IEEE-754 floating-point operations alone.

For example, SLIB/bytenumb.scm has R5RS code which converts between
numbers and byte representations of IEEE-754 numbers.
<http://savannah.gnu.org/cgi-bin/viewcvs/slib/slib/bytenumb.scm?rev=HEAD&content-type=text/vnd.viewcvs-markup>
In an SRFI-70 compliant implementation with bignums and flonums, all
single or double float numerical values are converted uniquely.  But
only one NaN value is converted because IEEE-754 operations provide no
way to distinguish NaNs.

Mandating more than one portable NaN value will necessitate
non-IEEE-754 mangling of flonums.  The ultimate extension of this idea
is the NaN-based pointer regimes mentioned in SRFI-70 discussions:
<http://srfi.schemers.org/srfi-70/mail-archive/msg00079.html>

 | > One could use NaNs for all sorts of purposes.  I think they are
 | > most useful when they flag impossible and unplanned-for numerical
 | > errors.

IEEE-754:1985 section 6.2:
 ...
 Quiet NaNs should, by means left to the implementor's discretion,
 afford retrospective diagnostic information inherited from invalid or
 unavailable data and results.

 | That's a valid opinion, but I do not share it.  I use them quite
 | usefully to flag possible and planned-for events for which there is
 | no other good answer.

Such reasonable disagreement is why R6RS should *not* specify a read
or write syntax for NaNs.  Implementations should be free to have
read/write syntax for NaNs or not.