You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
323 lines
16 KiB
323 lines
16 KiB
|
|
Known Floating-point Bugs Detected by TestFloat |
|
|
|
John R. Hauser |
|
1997 December 15 |
|
|
|
|
|
------------------------------------------------------------------------------- |
|
Introduction |
|
|
|
Several popular systems have bugs that TestFloat is very likely to run |
|
across. The ones I know of are documented here. First off, TestFloat finds |
|
no errors in the following processors/machines: |
|
|
|
AMD 486 DX4's |
|
Sun UltraSPARC 1's and 2's |
|
|
|
On the other hand, bugs are found in these processors/machines: |
|
|
|
Older Intel Pentiums (with the divide bug) |
|
Intel Pentium Pros |
|
Sun SPARCstation 1's and IPX's |
|
Sun SPARCstation 10's |
|
HP Precision Architecture processors, with HP-UX prior to version 10.10 |
|
|
|
For some reason, most of the bugs found involve conversions from floating- |
|
point to integer formats. |
|
|
|
The bugs are shown as actual TestFloat error lines, along with a brief |
|
explanation. The error lines given are not necessarily exhaustive and were |
|
not necessarily output in the order shown. |
|
|
|
This document does not pretend to be an authoritative bug listing for all |
|
commercial processors. The vast majority of processors are absent from this |
|
list because I have never run TestFloat on such machines and I thus have no |
|
knowledge of what bugs TestFloat might find in them. |
|
|
|
The latest version of this file can be found at the Web page `http:// |
|
http.cs.berkeley.edu/~jhauser/arithmetic/testfloat.html'. |
|
|
|
|
|
------------------------------------------------------------------------------- |
|
Older Intel Pentiums (with the divide bug) |
|
|
|
The following conversion problems are found on Pentiums that also suffer |
|
from the infamous floating-point divide bug. These bugs have been fixed on |
|
newer Pentiums. (TestFloat does not find the divide bug.) |
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
floatx80_to_int32 |
|
|
|
-- A few small fractions are treated as though they were zero. |
|
|
|
Errors found in floatx80_to_int32, rounding nearest_even: |
|
3FFB.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
3FFC.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
3FFC.C000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
BFFB.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
BFFC.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
Errors found in floatx80_to_int32, rounding to_zero: |
|
3FFB.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
3FFC.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
3FFC.C000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
BFFB.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
BFFC.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
BFFC.C000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
Errors found in floatx80_to_int32, rounding down: |
|
3FFB.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
3FFC.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
3FFC.C000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
BFFB.8000000000000000 soft: FFFFFFFF ....x syst: 00000000 ..... |
|
BFFC.8000000000000000 soft: FFFFFFFF ....x syst: 00000000 ..... |
|
BFFC.C000000000000000 soft: FFFFFFFF ....x syst: 00000000 ..... |
|
Errors found in floatx80_to_int32, rounding up: |
|
3FFB.8000000000000000 soft: 00000001 ....x syst: 00000000 ..... |
|
3FFC.8000000000000000 soft: 00000001 ....x syst: 00000000 ..... |
|
3FFC.C000000000000000 soft: 00000001 ....x syst: 00000000 ..... |
|
BFFB.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
BFFC.8000000000000000 soft: 00000000 ....x syst: 00000000 ..... |
|
|
|
3FFB.8000000000000000 is the fraction 1/16; 3FFC.8000000000000000 is 1/8; |
|
and 3FFC.C000000000000000 is 3/16. Both positive and negative inputs are |
|
affected. |
|
|
|
-- Some (all?) positive floating-point values between 2^32 - 1/2 |
|
(401E.FFFFFFFF00000000) and 2^32 (401F.0000000000000000) are rounded to |
|
zero when the rounding mode is nearest/even or up. |
|
|
|
Errors found in floatx80_to_int32, rounding nearest_even: |
|
401E.FFFFFFFF80000000 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFC00001FE soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFF8000000 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFEC00000 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFF002000 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFFC00000 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFFE00000 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFFFD7FFE soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFFFFFFFE soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFFFFFFFF soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
Errors found in floatx80_to_int32, rounding up: |
|
401E.FFFFFFFF00800000 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFF80000000 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFEFFFC000 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFC000000 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFE7FFFFF soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFFF00000 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFFFE0800 soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFFFF7FFB soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFFFFFFFE soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
401E.FFFFFFFFFFFFFFFF soft: 7FFFFFFF v.... syst: 00000000 ....x |
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
|
|
|
|
------------------------------------------------------------------------------- |
|
Intel Pentium Pros |
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
floatx80_to_int32 |
|
|
|
-- The inexact flag is sometimes raised instead of the invalid flag for |
|
floating-point inputs under -(2^32) (C01F.0000000000000000). This bug is |
|
sporadic. It appears to be deterministic but dependent on the sequence |
|
of operations executed. |
|
|
|
Errors found in floatx80_to_int32, rounding nearest_even: |
|
C01F.C000000000000002 soft: 80000000 v.... syst: 80000000 ....x |
|
C021.F00000000000003F soft: 80000000 v.... syst: 80000000 ....x |
|
Errors found in floatx80_to_int32, rounding to_zero: |
|
C021.F00000000000003F soft: 80000000 v.... syst: 80000000 ....x |
|
Errors found in floatx80_to_int32, rounding up: |
|
C01F.C000000000000007 soft: 80000000 v.... syst: 80000000 ....x |
|
C01F.C000000000001000 soft: 80000000 v.... syst: 80000000 ....x |
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
|
|
|
|
------------------------------------------------------------------------------- |
|
Sun SPARCstation 1's and IPX's |
|
|
|
Some older SPARCstations appear confused about whether underflow tininess is |
|
detected before or after rounding. For conversions from double precision |
|
to single precision, tininess is detected after rounding, while for all |
|
quadruple-precision operations it is detected before rounding. Single- and |
|
double-precision multipies go both ways: |
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
float32_mul, float64_mul |
|
|
|
-- For multiplies, underflow tininess is detected _before_ rounding if one |
|
of the inputs is subnormal, and _after_ rounding otherwise. If tininess |
|
is assumed to be detected before rounding, the following errors are |
|
generated: |
|
|
|
Errors found in float32_mul, rounding nearest_even: |
|
001.000001 07E.7FFFFE soft: 001.000000 ...ux syst: 001.000000 ....x |
|
001.000001 87E.7FFFFE soft: 801.000000 ...ux syst: 801.000000 ....x |
|
001.000002 07E.7FFFFC soft: 001.000000 ...ux syst: 001.000000 ....x |
|
001.000002 87E.7FFFFC soft: 801.000000 ...ux syst: 801.000000 ....x |
|
001.000004 07E.7FFFF8 soft: 001.000000 ...ux syst: 001.000000 ....x |
|
Errors found in float32_mul, rounding down: |
|
001.000001 87E.7FFFFE soft: 801.000000 ...ux syst: 801.000000 ....x |
|
001.000002 87E.7FFFFC soft: 801.000000 ...ux syst: 801.000000 ....x |
|
001.000004 87E.7FFFF8 soft: 801.000000 ...ux syst: 801.000000 ....x |
|
001.000008 87E.7FFFF0 soft: 801.000000 ...ux syst: 801.000000 ....x |
|
001.000010 87E.7FFFE0 soft: 801.000000 ...ux syst: 801.000000 ....x |
|
Errors found in float32_mul, rounding up: |
|
001.000001 07E.7FFFFE soft: 001.000000 ...ux syst: 001.000000 ....x |
|
001.000002 07E.7FFFFC soft: 001.000000 ...ux syst: 001.000000 ....x |
|
001.000004 07E.7FFFF8 soft: 001.000000 ...ux syst: 001.000000 ....x |
|
001.000008 07E.7FFFF0 soft: 001.000000 ...ux syst: 001.000000 ....x |
|
001.000010 07E.7FFFE0 soft: 001.000000 ...ux syst: 001.000000 ....x |
|
Errors found in float64_mul, rounding nearest_even: |
|
001.0000000000001 3FE.FFFFFFFFFFFFE |
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x |
|
001.0000000000001 BFE.FFFFFFFFFFFFE |
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x |
|
001.0000000000002 3FE.FFFFFFFFFFFFC |
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x |
|
001.0000000000002 BFE.FFFFFFFFFFFFC |
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x |
|
001.0000000000004 3FE.FFFFFFFFFFFF8 |
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x |
|
Errors found in float64_mul, rounding down: |
|
001.0000000000001 BFE.FFFFFFFFFFFFE |
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x |
|
001.0000000000002 BFE.FFFFFFFFFFFFC |
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x |
|
001.0000000000004 BFE.FFFFFFFFFFFF8 |
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x |
|
001.0000000000008 BFE.FFFFFFFFFFFF0 |
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x |
|
001.0000000000010 BFE.FFFFFFFFFFFE0 |
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x |
|
Errors found in float64_mul, rounding up: |
|
001.0000000000001 3FE.FFFFFFFFFFFFE |
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x |
|
001.0000000000002 3FE.FFFFFFFFFFFFC |
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x |
|
001.0000000000004 3FE.FFFFFFFFFFFF8 |
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x |
|
001.0000000000008 3FE.FFFFFFFFFFFF0 |
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x |
|
001.0000000000010 3FE.FFFFFFFFFFFE0 |
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x |
|
|
|
If we assume tininess should be detected after rounding, we get the |
|
following errors: |
|
|
|
Errors found in float32_mul, rounding nearest_even: |
|
000.7FFC00 07F.000400 soft: 001.000000 ....x syst: 001.000000 ...ux |
|
000.7FFC00 87F.000400 soft: 801.000000 ....x syst: 801.000000 ...ux |
|
000.7FFE00 07F.000200 soft: 001.000000 ....x syst: 001.000000 ...ux |
|
000.7FFE00 87F.000200 soft: 801.000000 ....x syst: 801.000000 ...ux |
|
000.7FFF00 07F.000100 soft: 001.000000 ....x syst: 001.000000 ...ux |
|
Errors found in float32_mul, rounding down: |
|
000.7FFC00 87F.000400 soft: 801.000000 ....x syst: 801.000000 ...ux |
|
000.7FFE00 87F.000200 soft: 801.000000 ....x syst: 801.000000 ...ux |
|
000.7FFF00 87F.000100 soft: 801.000000 ....x syst: 801.000000 ...ux |
|
000.7FFF80 87F.000080 soft: 801.000000 ....x syst: 801.000000 ...ux |
|
000.7FFFC0 87F.000040 soft: 801.000000 ....x syst: 801.000000 ...ux |
|
Errors found in float32_mul, rounding up: |
|
000.7FFC00 07F.000400 soft: 001.000000 ....x syst: 001.000000 ...ux |
|
000.7FFE00 07F.000200 soft: 001.000000 ....x syst: 001.000000 ...ux |
|
000.7FFF00 07F.000100 soft: 001.000000 ....x syst: 001.000000 ...ux |
|
000.7FFF80 07F.000080 soft: 001.000000 ....x syst: 001.000000 ...ux |
|
000.7FFFC0 07F.000040 soft: 001.000000 ....x syst: 001.000000 ...ux |
|
Errors found in float64_mul, rounding nearest_even: |
|
000.FFFFFFE000000 3FF.0000002000000 |
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux |
|
000.FFFFFFE000000 BFF.0000002000000 |
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux |
|
000.FFFFFFF000000 3FF.0000001000000 |
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux |
|
000.FFFFFFF000000 BFF.0000001000000 |
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux |
|
000.FFFFFFF800000 3FF.0000000800000 |
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux |
|
Errors found in float64_mul, rounding down: |
|
000.FFFFFFE000000 BFF.0000002000000 |
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux |
|
000.FFFFFFF000000 BFF.0000001000000 |
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux |
|
000.FFFFFFF800000 BFF.0000000800000 |
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux |
|
000.FFFFFFFC00000 BFF.0000000400000 |
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux |
|
000.FFFFFFFE00000 BFF.0000000200000 |
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux |
|
Errors found in float64_mul, rounding up: |
|
000.FFFFFFE000000 3FF.0000002000000 |
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux |
|
000.FFFFFFF000000 3FF.0000001000000 |
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux |
|
000.FFFFFFF800000 3FF.0000000800000 |
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux |
|
000.FFFFFFFC00000 3FF.0000000400000 |
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux |
|
000.FFFFFFFE00000 3FF.0000000200000 |
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux |
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
|
|
|
|
------------------------------------------------------------------------------- |
|
Sun SPARCstation 10's |
|
|
|
Like other SPARCstations, some SPARCstation 10's are inconsistent regarding |
|
underflow tininess, detecting it after rounding for single- and double- |
|
precision operations and before rounding for quadruple-precision operations. |
|
The following bug has also been observed. |
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
float32_to_int32_round_to_zero, float64_to_int32_round_to_zero |
|
|
|
-- Single- and double-precision NaNs are converted to the integer zero. |
|
(The invalid exception flag is raised correctly.) |
|
|
|
Errors found in float32_to_int32_round_to_zero: |
|
8FF.5D36AC soft: 7FFFFFFF v.... syst: 00000000 v.... |
|
0FF.7FFFC0 soft: 7FFFFFFF v.... syst: 00000000 v.... |
|
8FF.7C0000 soft: 7FFFFFFF v.... syst: 00000000 v.... |
|
0FF.2AB7ED soft: 7FFFFFFF v.... syst: 00000000 v.... |
|
0FF.03FFFF soft: 7FFFFFFF v.... syst: 00000000 v.... |
|
Errors found in float64_to_int32_round_to_zero: |
|
7FF.45AD84DB2524A soft: 7FFFFFFF v.... syst: 00000000 v.... |
|
7FF.CFEE063EE0512 soft: 7FFFFFFF v.... syst: 00000000 v.... |
|
7FF.89FF03AB7DBA2 soft: 7FFFFFFF v.... syst: 00000000 v.... |
|
7FF.FFFFFFFFFF800 soft: 7FFFFFFF v.... syst: 00000000 v.... |
|
FFF.68A6410E91BF6 soft: 7FFFFFFF v.... syst: 00000000 v.... |
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
|
|
|
|
------------------------------------------------------------------------------- |
|
HP Precision Architecture processors, with HP-UX prior to version 10.10 |
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
float32_to_int32_round_to_zero, float64_to_int32_round_to_zero |
|
|
|
-- When the floating-point value is too large, the overflow and inexact |
|
exception flags are raised instead of the invalid flag. |
|
|
|
Errors found in float32_to_int32_round_to_zero: |
|
89E.000007 soft: 80000000 v.... syst: 80000000 ..o.x |
|
0A2.000020 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x |
|
8FA.7C0000 soft: 80000000 v.... syst: 80000000 ..o.x |
|
Errors found in float64_to_int32_round_to_zero: |
|
7FD.0448700002F1C soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x |
|
DAA.F000000000000 soft: 80000000 v.... syst: 80000000 ..o.x |
|
41E.063DA00005E65 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x |
|
47E.FFFF800000000 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x |
|
51F.0000000000004 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x |
|
DDA.0000001FFFFFF soft: 80000000 v.... syst: 80000000 ..o.x |
|
D70.00000000003FF soft: 80000000 v.... syst: 80000000 ..o.x |
|
C7E.0000100000000 soft: 80000000 v.... syst: 80000000 ..o.x |
|
47E.000000000007F soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x |
|
D57.000000000FFFF soft: 80000000 v.... syst: 80000000 ..o.x |
|
|
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
|
|
|
|
|