Apologies for the long post.
I decided it would be useful to see how the C version of the ieeefp-tests works. I've appended the double-float output file generated via GCC on a sparc/solaris8 box.
There are some surprises there. CMUCL/sparc has failures on cosh and sin. The C version shows no such errors, but does shows errors on atan2, which doesn't happen on CMUCL/sparc.
More study needed, I think.
Ray
Total 60 tests: pass 60, flags err 0, value err 0, acosd Total 352 tests: pass 352, flags err 0, value err 0, addd Total 77 tests: pass 77, flags err 0, value err 0, asind Value error: atan2d n eq - Input: 80000000 00000000 00000000 00000000 Computed: 00000000 00000000 Expected: 80000000 00000000 - Value error: atan2d n eq ?x Input: 00000000 00000000 80000000 00000000 Computed: 00000000 00000000 Expected: 400921FB 54442D18 ?x Value error: atan2d n eq ?x Input: 80000000 00000000 80000000 00000000 Computed: 00000000 00000000 Expected: C00921FB 54442D18 ?x Total 104 tests: pass 101, flags err 0, value err 3, atan2d ucbtest UCBFAIL in atan2d at line 701 for double Total 57 tests: pass 57, flags err 0, value err 0, atand Total 126 tests: pass 126, flags err 0, value err 0, cabsd Total 99 tests: pass 99, flags err 0, value err 0, ceild Total 53 tests: pass 53, flags err 0, value err 0, cosd Total 68 tests: pass 68, flags err 0, value err 0, coshd Total 383 tests: pass 383, flags err 0, value err 0, divd Total 97 tests: pass 97, flags err 0, value err 0, expd Total 37 tests: pass 37, flags err 0, value err 0, fabsd Total 103 tests: pass 103, flags err 0, value err 0, floord Total 352 tests: pass 352, flags err 0, value err 0, fmodd Total 126 tests: pass 126, flags err 0, value err 0, hypotd Total 89 tests: pass 89, flags err 0, value err 0, log10d Total 83 tests: pass 83, flags err 0, value err 0, logd Total 340 tests: pass 340, flags err 0, value err 0, muld Value error: powd n eq - Input: 7FF00000 00000001 00000000 00000000 Computed: 7FF00000 00000001 Expected: 3FF00000 00000000 - Value error: powd n eq - Input: 7FF80000 00000001 80000000 00000000 Computed: 7FF80000 00000001 Expected: 3FF00000 00000000 - Value error: powd n eq - Input: FFF00000 00000001 00000000 00000000 Computed: FFF00000 00000001 Expected: 3FF00000 00000000 - Value error: powd n eq - Input: FFF80000 00000001 80000000 00000000 Computed: FFF80000 00000001 Expected: 3FF00000 00000000 - Value error: powd n eq d Input: 00000000 00000000 FFEFFFFF FFFFFFFF Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 00000000 00000000 80000000 00000001 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 80000000 00000000 FFEFFFFF FFFFFFFF Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 80000000 00000000 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d?x Input: 80000000 00000000 80000000 00000001 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d?x Value error: powd n eq - Input: 7FF02000 00000000 00000000 00000000 Computed: 7FF02000 00000000 Expected: 3FF00000 00000000 - Value error: powd n eq - Input: 7FF02000 00000000 80000000 00000000 Computed: 7FF02000 00000000 Expected: 3FF00000 00000000 - Value error: powd n eq - Input: 7FFFE000 00000000 00000000 00000000 Computed: 7FFFE000 00000000 Expected: 3FF00000 00000000 - Value error: powd n eq - Input: 7FFFE000 00000000 80000000 00000000 Computed: 7FFFE000 00000000 Expected: 3FF00000 00000000 - Value error: powd n eq - Input: FFF02000 00000000 00000000 00000000 Computed: FFF02000 00000000 Expected: 3FF00000 00000000 - Value error: powd n eq - Input: FFF02000 00000000 80000000 00000000 Computed: FFF02000 00000000 Expected: 3FF00000 00000000 - Value error: powd n eq - Input: FFFFE000 00000000 00000000 00000000 Computed: FFFFE000 00000000 Expected: 3FF00000 00000000 - Value error: powd n eq - Input: FFFFE000 00000000 80000000 00000000 Computed: FFFFE000 00000000 Expected: 3FF00000 00000000 - Value error: powd n eq ?xd Input: 80000000 00000000 80000000 00000001 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 ?xd Value error: powd n eq d Input: 00000000 00000000 BFE00000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 00000000 00000000 BFF00000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 00000000 00000000 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 00000000 00000000 C0220000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 00000000 00000000 C0700000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 00000000 00000000 C0DFFFC0 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 00000000 00000000 C0E00000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 80000000 00000000 BFE00000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 80000000 00000000 C0700000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq d Input: 80000000 00000000 C0E00000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 d Value error: powd n eq xo Input: 80000000 00000001 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80000000 00000001 C0DFFF80 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80000000 00000002 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80000000 00000003 C0700000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80000000 00000003 C0E00000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80040000 00000000 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80040000 00000001 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80080000 00000000 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80080000 00000000 C0E00000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 800FFFFF FFFFFFFF C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80100000 00000000 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80100000 00000001 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80100000 00000001 C0700000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80100000 00000001 C0DFFF80 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80100000 00000002 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80200000 00000000 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: 80300000 00000000 C0000000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: BC900000 00000000 C06F8000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: BCB00000 00000000 C0704000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: C0000000 00000000 40900000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: C0700000 00000000 40A00000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: C0F00000 00000000 40900000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: FFE00000 00000000 40700000 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Value error: powd n eq xo Input: FFE00000 00000000 40DFFF80 00000000 Computed: FFF00000 00000000 Expected: 7FF00000 00000000 xo Total 1543 tests: pass 1491, flags err 0, value err 52, powd ucbtest UCBFAIL in powd at line 701 for double Total 52 tests: pass 52, flags err 0, value err 0, sind Total 72 tests: pass 72, flags err 0, value err 0, sinhd Total 102 tests: pass 102, flags err 0, value err 0, sqrtd Total 321 tests: pass 321, flags err 0, value err 0, subd Total 54 tests: pass 54, flags err 0, value err 0, tand Total 72 tests: pass 72, flags err 0, value err 0, tanhd UCBFAIL clib_DP.output , 25 out of 25 tests completed
Raymond Toy toy@rtp.ericsson.se writes:
There are some surprises there. CMUCL/sparc has failures on cosh and sin. The C version shows no such errors, but does shows errors on atan2, which doesn't happen on CMUCL/sparc.
atan2 is currently untested in lisp, I think.
More study needed, I think.
Definitely :-)
Cheers,
Christophe
"Raymond" == Raymond Toy toy@rtp.ericsson.se writes:
Raymond> Apologies for the long post.
Raymond> I decided it would be useful to see how the C version of the Raymond> ieeefp-tests works. I've appended the double-float output file Raymond> generated via GCC on a sparc/solaris8 box.
[snip]
Raymond> Total 68 tests: pass 68, flags err 0, value err 0, coshd
So all coshd tests pass. But the Lisp version says not. In particular double-cosh-value.10 fails. The expected result is most-positive-double-float, but we return infinity. Calling kernel:%cosh returns infinity too.
A simple C test program for sparc confirms that cosh does indeed return infinity. So either the C test is messed up or my simple test is.
Aargh.
Ray
#include <stdio.h> #include <math.h> #include <ieeefp.h>
union dnum { long words[2]; double fl; };
int main() { union dnum x; union dnum y;
x.words[0] = 0xC08633CE; x.words[1] = 0x8FB9F87E;
printf("x = %lg\n", x.fl);
fpsetround(FP_RM);
y.fl = cosh(x.fl);
printf("y = 0x%08lx%08lx = %lg\n", y.words[0], y.words[1], y.fl);
return 0; }
Output:
x = -710.476 y = 0x7ff0000000000000 = Inf
ieeefp-tests-devel@common-lisp.net