Re: external representations William D Clinger (24 Jun 2005 04:25 UTC)
Re: external representations Bradley Lucier (24 Jun 2005 22:36 UTC)
Re: external representations Bradley Lucier (27 Jun 2005 20:57 UTC)

Re: external representations Bradley Lucier 27 Jun 2005 20:56 UTC

On Jun 23, 2005, at 11:25 PM, William D Clinger wrote:

> Bradley Lucier wrote:
>
>
>> Re: Your idea of representing common Scheme values as NaNs.
>>
>> I believe it is possible under IEEE 754 that the "hardware"
>> could return a different NaN for each execution of (/ 0. 0.)
>> in the code (for example). (Some proposals have suggested
>> putting the address of the code and/or a rough time stamp
>> in the mantissa.) I'm a bit concerned that a floating-point
>> operation could return a value that would be interpreted by
>> your scheme as #\C (for example).
>>
>
> Interesting.  Can you tell me of any hardware that actually
> does this?

Apple's libraries do not put an address or a timestamp in the
mantissa of a NaN, but they do put a code indicating where the
problem arose.  E.g., in

http://developer.apple.com/documentation/mac/PPCNumerics/
PPCNumerics-17.html#HEADING17-45

we find

> A NaN may have an associated code that indicates its origin. These
> codes are listed in Table 2-3. The NaN code is the 8th through 15th
> most significant bits of the fraction field.
> Table 2-3 NaN codes
>
> Decimal    Hexadecimal    Meaning
> 1    0x01    Invalid square root, such as SQRT-1
> 2    0x02    Invalid addition, such as (+ )+(- )
> 4    0x04    Invalid division, such as 0/0
> 8    0x08    Invalid multiplication, such as 0×
> 9    0x09    Invalid remainder or modulo, such as x rem 0
> 17    0x11    Attempt to convert invalid ASCII string
> 21    0x15    Attempt to create a NaN with a zero code
> 33    0x21    Invalid argument to trigonometric function (such as
> cos, sin, tan)
> 34    0x22    Invalid argument to inverse trigonometric function
> (such as acos, asin, atan)
> 36    0x24    Invalid argument to logarithmic function (such as
> log, log10 )
> 37    0x25    Invalid argument to exponential function (such as
> exp, expm1)
> 38    0x26    Invalid argument to financial function (compound or
> annuity)
> 40    0x28    Invalid argument to inverse hyperbolic function (such
> as acosh, asinh)
> 42    0x2A    Invalid argument to gamma function (gamma or lgamma)
>
> Note
>     The PowerPC processor always returns 0 for the NaN code.

and the following code gives

[descartes:~] lucier% gcc -Wall -o testfp testfp.c -save-temps
[descartes:~] lucier% ./testfp
7ff8000000000000 7ff8048000000000 7ff8044000000000 7ff8000000000000
[descartes:~] lucier% cat testfp.c
#include <stdio.h>
#include <math.h>

int main() {
   union {
     long long int i;
     double d;
   } x, y, z, a;

   x.d = sqrt(-1.0);
   y.d = log (-1.0);
   z.d = acos(2.0);
   a.d = (1.0 / 0.0) - (1.0 / 0.0);
   printf("%llx %llx %llx %llx\n", x.i, y.i, z.i, a.i);
   return 0;
}

I'd like to have access to those codes if they're available.  In
other words, I'd like all bit strings that can be interpreted as NaNs
by the floating-point system to have external representations.

Brad