2 Known Floating-point Bugs Detected by TestFloat
8 -------------------------------------------------------------------------------
11 Several popular systems have bugs that TestFloat is very likely to run
12 across. The ones I know of are documented here. First off, TestFloat finds
13 no errors in the following processors/machines:
16 Sun UltraSPARC 1's and 2's
18 On the other hand, bugs are found in these processors/machines:
20 Older Intel Pentiums (with the divide bug)
22 Sun SPARCstation 1's and IPX's
24 HP Precision Architecture processors, with HP-UX prior to version 10.10
26 For some reason, most of the bugs found involve conversions from floating-
27 point to integer formats.
29 The bugs are shown as actual TestFloat error lines, along with a brief
30 explanation. The error lines given are not necesarily exhaustive and were
31 not necessarily output in the order shown.
33 This document does not pretend to be an authoritative bug listing for all
34 commercial processors. The vast majority of processors are absent from this
35 list because I have never run TestFloat on such machines and I thus have no
36 knowledge of what bugs TestFloat might find in them.
38 The latest version of this file can be found at the Web page `http://
39 http.cs.berkeley.edu/~jhauser/arithmetic/testfloat.html'.
42 -------------------------------------------------------------------------------
43 Older Intel Pentiums (with the divide bug)
45 The following conversion problems are found on Pentiums that also suffer
46 from the infamous floating-point divide bug. These bugs have been fixed on
47 newer Pentiums. (TestFloat does not find the divide bug.)
49 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
52 -- A few small fractions are treated as though they were zero.
54 Errors found in floatx80_to_int32, rounding nearest_even:
55 3FFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
56 3FFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
57 3FFC.C000000000000000 soft: 00000000 ....x syst: 00000000 .....
58 BFFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
59 BFFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
60 Errors found in floatx80_to_int32, rounding to_zero:
61 3FFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
62 3FFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
63 3FFC.C000000000000000 soft: 00000000 ....x syst: 00000000 .....
64 BFFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
65 BFFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
66 BFFC.C000000000000000 soft: 00000000 ....x syst: 00000000 .....
67 Errors found in floatx80_to_int32, rounding down:
68 3FFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
69 3FFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
70 3FFC.C000000000000000 soft: 00000000 ....x syst: 00000000 .....
71 BFFB.8000000000000000 soft: FFFFFFFF ....x syst: 00000000 .....
72 BFFC.8000000000000000 soft: FFFFFFFF ....x syst: 00000000 .....
73 BFFC.C000000000000000 soft: FFFFFFFF ....x syst: 00000000 .....
74 Errors found in floatx80_to_int32, rounding up:
75 3FFB.8000000000000000 soft: 00000001 ....x syst: 00000000 .....
76 3FFC.8000000000000000 soft: 00000001 ....x syst: 00000000 .....
77 3FFC.C000000000000000 soft: 00000001 ....x syst: 00000000 .....
78 BFFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
79 BFFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
81 3FFB.8000000000000000 is the fraction 1/16; 3FFC.8000000000000000 is 1/8;
82 and 3FFC.C000000000000000 is 3/16. Both positive and negative inputs are
85 -- Some (all?) positive floating-point values between 2^32 - 1/2
86 (401E.FFFFFFFF00000000) and 2^32 (401F.0000000000000000) are rounded to
87 zero when the rounding mode is nearest/even or up.
89 Errors found in floatx80_to_int32, rounding nearest_even:
90 401E.FFFFFFFF80000000 soft: 7FFFFFFF v.... syst: 00000000 ....x
91 401E.FFFFFFFFC00001FE soft: 7FFFFFFF v.... syst: 00000000 ....x
92 401E.FFFFFFFFF8000000 soft: 7FFFFFFF v.... syst: 00000000 ....x
93 401E.FFFFFFFFFEC00000 soft: 7FFFFFFF v.... syst: 00000000 ....x
94 401E.FFFFFFFFFF002000 soft: 7FFFFFFF v.... syst: 00000000 ....x
95 401E.FFFFFFFFFFC00000 soft: 7FFFFFFF v.... syst: 00000000 ....x
96 401E.FFFFFFFFFFE00000 soft: 7FFFFFFF v.... syst: 00000000 ....x
97 401E.FFFFFFFFFFFD7FFE soft: 7FFFFFFF v.... syst: 00000000 ....x
98 401E.FFFFFFFFFFFFFFFE soft: 7FFFFFFF v.... syst: 00000000 ....x
99 401E.FFFFFFFFFFFFFFFF soft: 7FFFFFFF v.... syst: 00000000 ....x
100 Errors found in floatx80_to_int32, rounding up:
101 401E.FFFFFFFF00800000 soft: 7FFFFFFF v.... syst: 00000000 ....x
102 401E.FFFFFFFF80000000 soft: 7FFFFFFF v.... syst: 00000000 ....x
103 401E.FFFFFFFFEFFFC000 soft: 7FFFFFFF v.... syst: 00000000 ....x
104 401E.FFFFFFFFFC000000 soft: 7FFFFFFF v.... syst: 00000000 ....x
105 401E.FFFFFFFFFE7FFFFF soft: 7FFFFFFF v.... syst: 00000000 ....x
106 401E.FFFFFFFFFFF00000 soft: 7FFFFFFF v.... syst: 00000000 ....x
107 401E.FFFFFFFFFFFE0800 soft: 7FFFFFFF v.... syst: 00000000 ....x
108 401E.FFFFFFFFFFFF7FFB soft: 7FFFFFFF v.... syst: 00000000 ....x
109 401E.FFFFFFFFFFFFFFFE soft: 7FFFFFFF v.... syst: 00000000 ....x
110 401E.FFFFFFFFFFFFFFFF soft: 7FFFFFFF v.... syst: 00000000 ....x
112 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
115 -------------------------------------------------------------------------------
118 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
121 -- The inexact flag is sometimes raised instead of the invalid flag for
122 floating-point inputs under -(2^32) (C01F.0000000000000000). This bug is
123 sporadic. It appears to be deterministic but dependent on the sequence
124 of operations executed.
126 Errors found in floatx80_to_int32, rounding nearest_even:
127 C01F.C000000000000002 soft: 80000000 v.... syst: 80000000 ....x
128 C021.F00000000000003F soft: 80000000 v.... syst: 80000000 ....x
129 Errors found in floatx80_to_int32, rounding to_zero:
130 C021.F00000000000003F soft: 80000000 v.... syst: 80000000 ....x
131 Errors found in floatx80_to_int32, rounding up:
132 C01F.C000000000000007 soft: 80000000 v.... syst: 80000000 ....x
133 C01F.C000000000001000 soft: 80000000 v.... syst: 80000000 ....x
135 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
138 -------------------------------------------------------------------------------
139 Sun SPARCstation 1's and IPX's
141 Some older SPARCstations appear confused about whether underflow tininess is
142 detected before or after rounding. For conversions from double precision
143 to single precision, tininess is detected after rounding, while for all
144 quadruple-precision operations it is detected before rounding. Single- and
145 double-precision multipies go both ways:
147 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
148 float32_mul, float64_mul
150 -- For multiplies, underflow tininess is detected _before_ rounding if one
151 of the inputs is subnormal, and _after_ rounding otherwise. If tininess
152 is assumed to be detected before rounding, the following errors are
155 Errors found in float32_mul, rounding nearest_even:
156 001.000001 07E.7FFFFE soft: 001.000000 ...ux syst: 001.000000 ....x
157 001.000001 87E.7FFFFE soft: 801.000000 ...ux syst: 801.000000 ....x
158 001.000002 07E.7FFFFC soft: 001.000000 ...ux syst: 001.000000 ....x
159 001.000002 87E.7FFFFC soft: 801.000000 ...ux syst: 801.000000 ....x
160 001.000004 07E.7FFFF8 soft: 001.000000 ...ux syst: 001.000000 ....x
161 Errors found in float32_mul, rounding down:
162 001.000001 87E.7FFFFE soft: 801.000000 ...ux syst: 801.000000 ....x
163 001.000002 87E.7FFFFC soft: 801.000000 ...ux syst: 801.000000 ....x
164 001.000004 87E.7FFFF8 soft: 801.000000 ...ux syst: 801.000000 ....x
165 001.000008 87E.7FFFF0 soft: 801.000000 ...ux syst: 801.000000 ....x
166 001.000010 87E.7FFFE0 soft: 801.000000 ...ux syst: 801.000000 ....x
167 Errors found in float32_mul, rounding up:
168 001.000001 07E.7FFFFE soft: 001.000000 ...ux syst: 001.000000 ....x
169 001.000002 07E.7FFFFC soft: 001.000000 ...ux syst: 001.000000 ....x
170 001.000004 07E.7FFFF8 soft: 001.000000 ...ux syst: 001.000000 ....x
171 001.000008 07E.7FFFF0 soft: 001.000000 ...ux syst: 001.000000 ....x
172 001.000010 07E.7FFFE0 soft: 001.000000 ...ux syst: 001.000000 ....x
173 Errors found in float64_mul, rounding nearest_even:
174 001.0000000000001 3FE.FFFFFFFFFFFFE
175 soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
176 001.0000000000001 BFE.FFFFFFFFFFFFE
177 soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
178 001.0000000000002 3FE.FFFFFFFFFFFFC
179 soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
180 001.0000000000002 BFE.FFFFFFFFFFFFC
181 soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
182 001.0000000000004 3FE.FFFFFFFFFFFF8
183 soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
184 Errors found in float64_mul, rounding down:
185 001.0000000000001 BFE.FFFFFFFFFFFFE
186 soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
187 001.0000000000002 BFE.FFFFFFFFFFFFC
188 soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
189 001.0000000000004 BFE.FFFFFFFFFFFF8
190 soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
191 001.0000000000008 BFE.FFFFFFFFFFFF0
192 soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
193 001.0000000000010 BFE.FFFFFFFFFFFE0
194 soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
195 Errors found in float64_mul, rounding up:
196 001.0000000000001 3FE.FFFFFFFFFFFFE
197 soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
198 001.0000000000002 3FE.FFFFFFFFFFFFC
199 soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
200 001.0000000000004 3FE.FFFFFFFFFFFF8
201 soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
202 001.0000000000008 3FE.FFFFFFFFFFFF0
203 soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
204 001.0000000000010 3FE.FFFFFFFFFFFE0
205 soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
207 If we assume tininess should be detected after rounding, we get the
210 Errors found in float32_mul, rounding nearest_even:
211 000.7FFC00 07F.000400 soft: 001.000000 ....x syst: 001.000000 ...ux
212 000.7FFC00 87F.000400 soft: 801.000000 ....x syst: 801.000000 ...ux
213 000.7FFE00 07F.000200 soft: 001.000000 ....x syst: 001.000000 ...ux
214 000.7FFE00 87F.000200 soft: 801.000000 ....x syst: 801.000000 ...ux
215 000.7FFF00 07F.000100 soft: 001.000000 ....x syst: 001.000000 ...ux
216 Errors found in float32_mul, rounding down:
217 000.7FFC00 87F.000400 soft: 801.000000 ....x syst: 801.000000 ...ux
218 000.7FFE00 87F.000200 soft: 801.000000 ....x syst: 801.000000 ...ux
219 000.7FFF00 87F.000100 soft: 801.000000 ....x syst: 801.000000 ...ux
220 000.7FFF80 87F.000080 soft: 801.000000 ....x syst: 801.000000 ...ux
221 000.7FFFC0 87F.000040 soft: 801.000000 ....x syst: 801.000000 ...ux
222 Errors found in float32_mul, rounding up:
223 000.7FFC00 07F.000400 soft: 001.000000 ....x syst: 001.000000 ...ux
224 000.7FFE00 07F.000200 soft: 001.000000 ....x syst: 001.000000 ...ux
225 000.7FFF00 07F.000100 soft: 001.000000 ....x syst: 001.000000 ...ux
226 000.7FFF80 07F.000080 soft: 001.000000 ....x syst: 001.000000 ...ux
227 000.7FFFC0 07F.000040 soft: 001.000000 ....x syst: 001.000000 ...ux
228 Errors found in float64_mul, rounding nearest_even:
229 000.FFFFFFE000000 3FF.0000002000000
230 soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
231 000.FFFFFFE000000 BFF.0000002000000
232 soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
233 000.FFFFFFF000000 3FF.0000001000000
234 soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
235 000.FFFFFFF000000 BFF.0000001000000
236 soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
237 000.FFFFFFF800000 3FF.0000000800000
238 soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
239 Errors found in float64_mul, rounding down:
240 000.FFFFFFE000000 BFF.0000002000000
241 soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
242 000.FFFFFFF000000 BFF.0000001000000
243 soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
244 000.FFFFFFF800000 BFF.0000000800000
245 soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
246 000.FFFFFFFC00000 BFF.0000000400000
247 soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
248 000.FFFFFFFE00000 BFF.0000000200000
249 soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
250 Errors found in float64_mul, rounding up:
251 000.FFFFFFE000000 3FF.0000002000000
252 soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
253 000.FFFFFFF000000 3FF.0000001000000
254 soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
255 000.FFFFFFF800000 3FF.0000000800000
256 soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
257 000.FFFFFFFC00000 3FF.0000000400000
258 soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
259 000.FFFFFFFE00000 3FF.0000000200000
260 soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
262 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
265 -------------------------------------------------------------------------------
266 Sun SPARCstation 10's
268 Like other SPARCstations, some SPARCstation 10's are inconsistent regarding
269 underflow tininess, detecting it after rounding for single- and double-
270 precision operations and before rounding for quadruple-precision operations.
271 The following bug has also been observed.
273 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
274 float32_to_int32_round_to_zero, float64_to_int32_round_to_zero
276 -- Single- and double-precision NaNs are converted to the integer zero.
277 (The invalid exception flag is raised correctly.)
279 Errors found in float32_to_int32_round_to_zero:
280 8FF.5D36AC soft: 7FFFFFFF v.... syst: 00000000 v....
281 0FF.7FFFC0 soft: 7FFFFFFF v.... syst: 00000000 v....
282 8FF.7C0000 soft: 7FFFFFFF v.... syst: 00000000 v....
283 0FF.2AB7ED soft: 7FFFFFFF v.... syst: 00000000 v....
284 0FF.03FFFF soft: 7FFFFFFF v.... syst: 00000000 v....
285 Errors found in float64_to_int32_round_to_zero:
286 7FF.45AD84DB2524A soft: 7FFFFFFF v.... syst: 00000000 v....
287 7FF.CFEE063EE0512 soft: 7FFFFFFF v.... syst: 00000000 v....
288 7FF.89FF03AB7DBA2 soft: 7FFFFFFF v.... syst: 00000000 v....
289 7FF.FFFFFFFFFF800 soft: 7FFFFFFF v.... syst: 00000000 v....
290 FFF.68A6410E91BF6 soft: 7FFFFFFF v.... syst: 00000000 v....
292 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
295 -------------------------------------------------------------------------------
296 HP Precision Architecture processors, with HP-UX prior to version 10.10
298 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
299 float32_to_int32_round_to_zero, float64_to_int32_round_to_zero
301 -- When the floating-point value is too large, the overflow and inexact
302 exception flags are raised instead of the invalid flag.
304 Errors found in float32_to_int32_round_to_zero:
305 89E.000007 soft: 80000000 v.... syst: 80000000 ..o.x
306 0A2.000020 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
307 8FA.7C0000 soft: 80000000 v.... syst: 80000000 ..o.x
308 Errors found in float64_to_int32_round_to_zero:
309 7FD.0448700002F1C soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
310 DAA.F000000000000 soft: 80000000 v.... syst: 80000000 ..o.x
311 41E.063DA00005E65 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
312 47E.FFFF800000000 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
313 51F.0000000000004 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
314 DDA.0000001FFFFFF soft: 80000000 v.... syst: 80000000 ..o.x
315 D70.00000000003FF soft: 80000000 v.... syst: 80000000 ..o.x
316 C7E.0000100000000 soft: 80000000 v.... syst: 80000000 ..o.x
317 47E.000000000007F soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
318 D57.000000000FFFF soft: 80000000 v.... syst: 80000000 ..o.x
321 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -