Re: +-Inf and NaN

Richard Fateman <[email protected]> Wed, 28 Feb 2024 10:39:19 -0800
Newsgroups gmane.comp.mathematics.maxima.general,gmane.lisp.gcl.devel
Message-ID <CADB8Zm4_LrsxxTaFuQEKbuq0895uuEsuRVJ-=09Xp+=v3D64=Q@mail.gmail.com>
Years (decades?) ago I gave up on clever use of NaNs combined with speed.
If trapping
is enabled, but an exception sends the processor into some painful handler,
that's
still a prospect for diagnostics. Presumably the handler is given some
return address
and maybe some other bits, and this info could be stuffed into some payload
of the
NaN's mantissa.  I have not seen it done.
One prospect that I think I've mentioned is that one could encode a computer
algebra system into a NaN-based framework.  Floating-point numbers are
whatever
numbers they represent. A NaN is a pointer into a table that says.. this
NaN is the
symbol X,   or perhaps a Lisp S-expression.  The trap handling would call a
simplifier
program when the operation is ADD of two NaNs representing X and Y, to make
a
new NaN pointing to X+Y.   etc.
It seems to me this would be a fun project, but I have not studied
current facilities, and
probably higher-level language support for this is lacking. But maybe this
is an opportunity
for Lisp.
.
rjf

On Wed, Feb 28, 2024 at 9:51 AM Henry Baker <[email protected]> wrote:

> Re: use the mantissa of a NaN for storing info
>
>
>
> Great idea, but doesn't work in practice.
>
>
>
> The reason?
>
>
>
> The stuff you might want to store in the mantissa isn't normally available
> to the FP HW,
>
> so you would normally consider trapping.  But as I found to my
> consternation, trapping
>
> NaN's doesn't work/is useless, so you end up with an if-then-else
> expression instead of
>
> a simple HW FP op.  You've now lost most -- if not all -- of your HW FP
> performance.
>
>
>
> Part of the problem is that someone needed to do at least one PhD thesis
> on what sorts
>
> of things one might want to store in said mantissa, but to my knowledge,
> no such PhD
>
> thesis was ever written.  There's not much point in optimizing HW for some
> task that's
>
> never been researched before in SW.
>
>
>
> Re: uninitialized/missing data:
>
>
>
> Flagging uninitialized data might be about the *only* useful use for
> trapping NaN's.
>
>
>
> Missing data flags probably want to propagate transitively w/o trapping --
> e.g., what
>
> happens in spreadsheets when some entry is blank.
>
>
>
> -----Original Message-----
> From: Richard Fateman <[email protected]>
> Sent: Feb 28, 2024 8:11 AM
> To: Camm Maguire <[email protected]>
> Cc: Stavros Macrakis <[email protected]>, <
> [email protected]>, Robert Dodier <
> [email protected]>, <[email protected]>
> Subject: Re: [Maxima-discuss] +-Inf and NaN
>
>
> Not sure about* most* users.  You can read my old article about IEEE 754
> and programming languages.
> At least the intent for NaNs was that they would propagate through a
> computation and
> emerge only if relevant. At least under some conditions.
> I personally have no realistic use cases for using traps for numerics, or
> for propagating NaNs,
> but I'm not a professional error analyst; few if any Lisp programmers
> are... (Ray?)
> If all that is being questioned is the default enabling of trapping, it
> doesn't seem much
> of an issue.
>   It would be nice to see if we can (say) fill an "uninitialized" float
> array by
> initializing it with NaNs, or use the mantissa of a NaN for storing info.
> RJF
>
> On Wed, Feb 28, 2024 at 5:44 AM Camm Maguire <[email protected]>
> wrote:
>
>> Greetings!
>>
>> Raymond Toy <[email protected]> writes:
>>
>> > On Mon, Feb 26, 2024 at 5:28 AM Camm Maguire <[email protected]>
>> wrote:
>> >
>> >  Greetings, and thanks to all for the very helpful feedback!
>> >
>> >  I'd also like to note in passing that the excellent SBCL out of the box
>> >  triggers an error, which we separately refer to as an 'exception trap',
>> >  when NaN is passed to the comparison functions, e.g. '=.  And low and
>> >  behold, gcl does the same when 'trapping' is turned on, but gcl turns
>> >  trapping off 'out of the box'.  NaN does not trigger an exception nor
>> >
>> > I hope you will consider changing the default to trap on invalid
>> > operations so that instead of returning NaN, an error is signaled.  I
>> > certainly hate this behaviour, because after you do a long set of
>> > numerical computations, all the results are NaN.  I've just wasted a
>> > whole bunch of time.  This is super-annying in Javascript where you
>> > don't have an option of disabling traps.  Now you get to go through
>> > all the code and either put prints or checks for NaN to see what
>> > caused it.  What a colossal waste of time when the computer could have
>> > told me.
>> >
>>
>> This is good to hear, as I was of the opposite impression that most
>> users wanted NaNs to propagate freely.
>>
>>
>> >  error when passed to '+,'*,'cos etc. but returns NaN.  This is the
>> >  current state of play.  What follows is a discussion of what it means
>> >  and the best way to fit NaN into the common-lisp type lattice so it
>> does
>> >  not get in the way of the compiler.
>> >
>> >  In summary, NaN seems indistinguishable to me from an ignorable error
>> >  indicator at the hardware level.  It is not conceptually a 'valid
>> input'
>> >  to any of these functions, but is a clever design to propagate the
>> error
>> >  properly when ignored.  Conceptually, it seems no different from
>> >  'ignore-errors in common-lisp.  So really the spec is not all that far
>> >  away from IEEE.
>> >
>> > I suppose that that is true, but I don't think any Lisp programmer
>> > would wrap their entire programs in a ignore-errors form.  That's
>> > usually one done on a very limited scope.  Having traps off to get
>> > NaN, is basically the same idea.
>> >
>>
>> Wrapping code in ignore-errors is totally unnecessary.  I can insert a
>> specific handler within GCL's type-error mechanism to skip the error
>> when testing NaN depending on a global variable setting.  One question
>> is whether such a setting governing skipping a lisp error should be the
>> same as or distinct from the setting enabling hardware traps.
>>
>> >  As for common-lisp types, the obvious path is what GCL and others
>> >  currently implement, double precision NaN is of type 'long-float and
>> >  hence 'number.  This actually means that lisp will *stray* from IEEE
>> and
>> >
>> > I think one thing that confuses me, is that for gcl, single-float =
>> > double-float = double precision.  short-float is single precision.  I
>> > think long-float is double-precision.  I think all other lisps have
>> > single-float = single precision, double-float = double precision.
>> > Short-float is usually the same as single-float.  Long-float is
>> > usually double-float, if they don't have a separate long-float (like
>> > clisp).
>> >
>> > So whenever you say long-float, I sometimes think of actual
>> > long-floats like clisp, but you're actually talking about
>> > double-precision floats.
>>
>> Thanks, this needs to be cleaned up.  I think single-float should be
>> short-float (e.g. 4 bytes).
>>
>> I suppose in principle each of these could be distinct, long-float could
>> be long double, supported on most machines, and short float could be a
>> new 16bit float :-).  It looks like the next GCL version will be able to
>> pass 4 unboxed arguments of the same size on 64bit machines, 'object'
>> (e.g. void *), unsigned long, double, and float complex.  I have space
>> in the argument descriptor for 4 such formats, but on 32bit machines, we
>> only have three useful ones, given the absence of 'short float complex'.
>>
>> Take care,
>> --
>> Camm Maguire
>> [email protected]
>> ==========================================================================
>> "The earth is but one country, and mankind its citizens."  --  Baha'u'llah
>
>
>

_______________________________________________
Maxima-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/maxima-discuss