On Wed, Feb 21, 2024 at 8:57 AM Stavros Macrakis <macra...@gmail.com> wrote:

> Lisp arithmetic should be compatible with IEEE float arithmetic.
>

I wholeheartedly agree with this.  This is what the hardware does and we
shouldn't needlessly deviate from that.

NaN is an important part of preventing numeric calculations from giving
> incorrect results.
>

Not quite sure what you mean by this because NaN is, in a sense, an
incorrect result because we couldn't represent what was asked, like 0d0/0d0
or inf-inf.

Optimizing away (= x x) where x are of undeclared type seems like an
> extremely minor gain.
>
> As for most-positive-long-float, I am fine with interpreting that
> as most-positive-long-finite-float.
>

Same.

>
> On Wed, Feb 21, 2024 at 10:54 AM Camm Maguire <c...@maguirefamily.org>
> wrote:
>
>> Greetings, and thanks for your feedback!
>>
>> Raymond Toy <toy.raym...@gmail.com> writes:
>>
>> > When a is a floating-point number (= a a) should not be optimized to
>> > T.  Likewise (/= a a) should not be optimized to NIL.  I'm pretty sure
>> > IEEE754 says that NaN is never = to itself or another NaN or any other
>> > number.
>>
>> Why not?  I agree the 'C' IEEE operator of similar name ('==') should be
>> left untouched, but the spec for common-lisp::=  clearly implies that
>> the *same* NaN should be '= to itself, and even that different boxed
>> versions of the same bit patterns should be.  I am suggesting that (/= a
>> a) not be a NaN detector, but to provide some other means (described
>> below).
>>
>> I agree on 'staying close to the hardware', and one could just as well
>> say who cares on a practical violation of the spec.  In general I am
>> sympathetic to such a point of view, but here it seems unnecessary.
>>
>> Lisp after all is just a bunch of hardware instructions with optional
>> type checking layered on top :-).  #'car on a long-float should trigger
>> an error, and does at certain safety levels, but compile at safety 0,
>> and one gets the 'hardware' car which will return a value however
>> dubious it may be.  The same could be the case for '=.  Say NaN was
>> boxed with identical layout to a long-float, but with a different
>> type-word denoting something orthogonal to 'number, say 'ieee-special-64
>> or some such.  '= will then signal an error on nan input, except when
>> compiled at safety 0, in which case the NaN can be read as before in
>> boxed or unboxed form.  The compiler would then simplify '= to t on
>> equivalent bindings, and we could use #'si::isnan or even (typep nan
>> 'ieee-special-64) as a detector.
>>
>>
>> >
>> >  We also have the following charming behavior:
>> >
>> >  (typep nan 'long-float) ->t
>> >  (typep nan '(long-float 0) ->nil
>> >  (typep nan '(long-float * 0)) ->nil
>> >  (typep nan '(or (long-float 0) (long-float * 0))) ->nil
>> >
>> >  but the first and last types are of course identical.
>> >
>> > Isn't the last one a bug?  Should the compiler convert (or (long-float
>> > 0) (long-float * 0)) to just long-float?
>> >
>>
>> I don't think so.  (typep a '(or b c)) == (or (typep a b) (typep a c))
>>
>>
>> > I'm not sure what the second and third cases returning nil really
>> > means in practice.  I think even if you declare a function as only
>> > taking and returning (long-float 0), you can have operations return
>> > NaN, even if the inputs are non-negative floats.
>> >
>>
>> It means that NaN does not fit into a total ordering scheme of say
>> long-floats, and the type explicitly recognizes and denotes ordered
>> subsets.
>>
>>
>> >  If NaN was truly 'not a number', the numerical functions would trigger
>> >  an error on input only when compiled with safety, and might be arranged
>> >
>> > I think I would defer to whatever the HW does and the floating point
>> > traps that are enabled.  If the invalid trap is enabled, then we get
>> > errors.  If the invalid trap is disabled, NaN gets returned.
>> >
>>
>> I think we can have our cacke and eat it too.  We can still compile at
>> safety 0 and proceed with errors optionally triggered only when setting
>> FPE traps.  But when interpreted or compiled with safety, standard type
>> errors would be triggered.
>>
>>
>> > The subject also mentions +/= inf.  Did you forget to mention issues
>> > with infinities?
>> >
>>
>> I am much less bothered by these, though they do make
>> most-positive-long-float meaningless.  They are in fact quite useful in
>> bounds checking arithmetic in the compiler.  Maybe
>> most-positive-long-float == +inf?
>>
>> Can anyone without too much effort summarize how other lisps handle
>> this?  Can one access/manipulate nan at the lisp prompt level?
>>
>> Take care,
>>
>> >  Take care,
>> >  --
>> >  Camm Maguire
>> c...@maguirefamily.org
>> >
>> ==========================================================================
>> >  "The earth is but one country, and mankind its citizens."  --
>> Baha'u'llah
>>
>> --
>> Camm Maguire
>> c...@maguirefamily.org
>> ==========================================================================
>> "The earth is but one country, and mankind its citizens."  --  Baha'u'llah
>>
>

-- 
Ray

Reply via email to