Re: arithmetic issues Aubrey Jaffer 23 Oct 2005 20:50 UTC

 | Date: Sun, 23 Oct 2005 22:01:37 +0200
 | From: =?ISO-8859-1?Q?Jens_Axel_S=F8gaard?= <xxxxxx@soegaard.net>
 |
 | Aubrey Jaffer wrote:
 | >  | From: Thomas Bushnell BSG <xxxxxx@becket.net>
 | >  | Date: Sun, 23 Oct 2005 12:39:43 -0700
 | >  |
 | >  | Aubrey Jaffer <xxxxxx@alum.mit.edu> writes:
 | >  |
 | >  | > When different NaNs are returned depending on the circumstances
 | >  | > creating them, I would like my implementation to display them
 | >  | > like this:
 | >  | >
 | >  | >   #<not-a-number expt>
 | >  |
 | >  | Sure, that seems fine.  We could mandate that as the readable written
 | >  | representation!
 | >
 | > It should *not* be a readable representation.  That serves only to
 | > mask mathematical errors in saved datasets.  As Bakul Shah wrote:
 | > "... IEEE754 says NaN is the result of an *invalid* operation, when an
 | > operation's operands lie outside its domain."
 |
 | Say I want to write my own mathematical function and need to return
 | NaN?  E.g.
 |
 |    (if <check-arguments>
 |        <calculate-result>
 |        #<not-a-number>
 |
 | is, to me, more readable than
 |
 |    (if <check-arguments>
 |        <calculate-result>
 |        (/ 0.0 0.0))

That is a good point.  Of course you would want the written
representation to match the literal form so it works for
program-writing programs.  Argggh!

In my experience writing lots of mathematical code, the trick is not
generating NaNs, it is preventing them.  Searching through my 70000
line Scheme codebase, I find no literal NaNs or infinities.

For example, this code for EXPT generates NaNs when z1 is infinite.
No tests or NaN literals are required:

  (exp (* (if (zero? z1) (real-part z2) z2) (log z1)))

So I would prefer the (/ 0. 0.) option because I think it will arise
rarely, if ever.