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.