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