Added
Link Here
|
1 |
/******************************************************************************* |
2 |
* Copyright (c) 2000, 2004 IBM Corporation and others. |
3 |
* All rights reserved. This program and the accompanying materials |
4 |
* are made available under the terms of the Common Public License v1.0 |
5 |
* which accompanies this distribution, and is available at |
6 |
* http://www.eclipse.org/legal/cpl-v10.html |
7 |
* |
8 |
* Contributors: |
9 |
* IBM Corporation - initial API and implementation |
10 |
*******************************************************************************/ |
11 |
package org.eclipse.jdt.core.tests.compiler.regression; |
12 |
|
13 |
import java.util.ArrayList; |
14 |
import java.util.Iterator; |
15 |
import java.util.List; |
16 |
|
17 |
import junit.framework.Test; |
18 |
import org.eclipse.jdt.internal.compiler.util.FloatUtil; |
19 |
|
20 |
public class InternalHexFloatTest extends AbstractRegressionTest { |
21 |
|
22 |
/* |
23 |
* Indicates whether this test is being run by a 1.5 JRE. |
24 |
* If it is, it's possible to cross check the expected values |
25 |
* with what the 1.5 JRE library computes. |
26 |
*/ |
27 |
static final boolean isJ2SE5 = false; |
28 |
|
29 |
static class DoubleTest { |
30 |
String input; |
31 |
long output; |
32 |
public DoubleTest(String input, long output) { |
33 |
this.input = input; |
34 |
this.output = output; |
35 |
} |
36 |
} |
37 |
|
38 |
static class FloatTest { |
39 |
String input; |
40 |
int output; |
41 |
public FloatTest(String input, int output) { |
42 |
this.input = input; |
43 |
this.output = output; |
44 |
} |
45 |
} |
46 |
|
47 |
public InternalHexFloatTest(String name) { |
48 |
super(name); |
49 |
} |
50 |
public static Test suite() { |
51 |
return setupSuite(testClass()); |
52 |
} |
53 |
|
54 |
public static Class testClass() { |
55 |
return InternalHexFloatTest.class; |
56 |
} |
57 |
|
58 |
/** |
59 |
*/ |
60 |
public void test001() { |
61 |
List x = new ArrayList(); |
62 |
|
63 |
// various forms of zero |
64 |
x.add(new DoubleTest("0x0p0", 0x0L)); |
65 |
x.add(new DoubleTest("0x0p0d", 0x0L)); |
66 |
x.add(new DoubleTest("0x0p0D", 0x0L)); |
67 |
x.add(new DoubleTest("0x0.0p0D", 0x0L)); |
68 |
x.add(new DoubleTest("0x.0p0D", 0x0L)); |
69 |
x.add(new DoubleTest("0x0.p0D", 0x0L)); |
70 |
x.add(new DoubleTest("0x00000.00000000000p0D", 0x0L)); |
71 |
x.add(new DoubleTest("0x0p99D", 0x0L)); |
72 |
x.add(new DoubleTest("0x0p-99D", 0x0L)); |
73 |
x.add(new DoubleTest("0x0p9999999D", 0x0L)); |
74 |
x.add(new DoubleTest("0x0p-9999999D", 0x0L)); |
75 |
|
76 |
// small doubles |
77 |
x.add(new DoubleTest("0x0.8p0D", 0x3fe0000000000000L)); |
78 |
x.add(new DoubleTest("0x0.4p0D", 0x3fd0000000000000L)); |
79 |
x.add(new DoubleTest("0x0.2p0D", 0x3fc0000000000000L)); |
80 |
x.add(new DoubleTest("0x0.1p0D", 0x3fb0000000000000L)); |
81 |
x.add(new DoubleTest("0x0.08p0D", 0x3fa0000000000000L)); |
82 |
x.add(new DoubleTest("0x0.04p0D", 0x3f90000000000000L)); |
83 |
x.add(new DoubleTest("0x0.02p0D", 0x3f80000000000000L)); |
84 |
x.add(new DoubleTest("0x0.01p0D", 0x3f70000000000000L)); |
85 |
x.add(new DoubleTest("0x0.010p0D", 0x3f70000000000000L)); |
86 |
x.add(new DoubleTest("0x1p0D", 0x3ff0000000000000L)); |
87 |
x.add(new DoubleTest("0x2p0D", 0x4000000000000000L)); |
88 |
x.add(new DoubleTest("0x4p0D", 0x4010000000000000L)); |
89 |
x.add(new DoubleTest("0x8p0D", 0x4020000000000000L)); |
90 |
x.add(new DoubleTest("0x10p0D", 0x4030000000000000L)); |
91 |
x.add(new DoubleTest("0x20p0D", 0x4040000000000000L)); |
92 |
x.add(new DoubleTest("0x40p0D", 0x4050000000000000L)); |
93 |
x.add(new DoubleTest("0x80p0D", 0x4060000000000000L)); |
94 |
x.add(new DoubleTest("0x80.p0D", 0x4060000000000000L)); |
95 |
x.add(new DoubleTest("0x80.8p0D", 0x4060100000000000L)); |
96 |
x.add(new DoubleTest("0x80.80p0D", 0x4060100000000000L)); |
97 |
x.add(new DoubleTest("0x123456789p0D", 0x41f2345678900000L)); |
98 |
x.add(new DoubleTest("0xabcedfp0D", 0x416579dbe0000000L)); |
99 |
x.add(new DoubleTest("0xABCDEFp0D", 0x416579bde0000000L)); |
100 |
|
101 |
x.add(new DoubleTest("0x0.0100000000000000000000000000000000000000000000000p0d", 0x3f70000000000000L)); |
102 |
x.add(new DoubleTest("0x0.0000000000000000000000000000000000000000000000001p0d", 0x33b0000000000000L)); |
103 |
x.add(new DoubleTest("0x10000000000000000000000000000000000000000000000000000p0d", 0x4cf0000000000000L)); |
104 |
|
105 |
// rounding to 53 bits |
106 |
x.add(new DoubleTest("0x823456789012380p0d", 0x43a0468acf120247L)); |
107 |
x.add(new DoubleTest("0xFFFFFFFFFFFFF80p0d", 0x43afffffffffffffL)); |
108 |
x.add(new DoubleTest("0xFFFFFFFFFFFFFC0p0d", 0x43b0000000000000L)); |
109 |
x.add(new DoubleTest("0xFFFFFFFFFFFFFA0p0d", 0x43afffffffffffffL)); |
110 |
x.add(new DoubleTest("0xFFFFFFFFFFFFF81p0d", 0x43afffffffffffffL)); |
111 |
x.add(new DoubleTest("0x123456789abcd10p0d", 0x43723456789abcd1L)); |
112 |
x.add(new DoubleTest("0x123456789abcd18p0d", 0x43723456789abcd2L)); |
113 |
x.add(new DoubleTest("0x7FFFFFFFFFFFFC0p0d", 0x439fffffffffffffL)); |
114 |
x.add(new DoubleTest("0x7FFFFFFFFFFFFE0p0d", 0x43a0000000000000L)); |
115 |
x.add(new DoubleTest("0x3FFFFFFFFFFFFE0p0d", 0x438fffffffffffffL)); |
116 |
x.add(new DoubleTest("0x3FFFFFFFFFFFFF0p0d", 0x4390000000000000L)); |
117 |
x.add(new DoubleTest("0x1FFFFFFFFFFFFF0p0d", 0x437fffffffffffffL)); |
118 |
x.add(new DoubleTest("0x1FFFFFFFFFFFFF8p0d", 0x4380000000000000L)); |
119 |
|
120 |
// rounding to overflow at +1024; denormalized at -1022; underflow at -1075 |
121 |
x.add(new DoubleTest("0x1p5000D", 0x7ff0000000000000L)); |
122 |
x.add(new DoubleTest("0x1p-5000D", 0x7ff8000000000000L)); |
123 |
x.add(new DoubleTest("0x1.0p1022d", 0x7fd0000000000000L)); |
124 |
x.add(new DoubleTest("0x1.0p1023d", 0x7fe0000000000000L)); |
125 |
x.add(new DoubleTest("0x1.0p1024d", 0x7ff0000000000000L)); |
126 |
x.add(new DoubleTest("0x1.0p-1022d", 0x0010000000000000L)); |
127 |
x.add(new DoubleTest("0x1.0p-1023d", 0x0008000000000000L)); |
128 |
x.add(new DoubleTest("0x1.0p-1024d", 0x0004000000000000L)); |
129 |
x.add(new DoubleTest("0x1.0p-1074d", 0x0000000000000001L)); |
130 |
x.add(new DoubleTest("0x1.0p-1075d", 0x7ff8000000000000L)); |
131 |
x.add(new DoubleTest("0x1.0p-1076d", 0x7ff8000000000000L)); |
132 |
x.add(new DoubleTest("0x1.0p-1077d", 0x7ff8000000000000L)); |
133 |
x.add(new DoubleTest("0x1.0p-1078d", 0x7ff8000000000000L)); |
134 |
x.add(new DoubleTest("0x0.8p1023d", 0x7fd0000000000000L)); |
135 |
x.add(new DoubleTest("0x0.8p1024d", 0x7fe0000000000000L)); |
136 |
x.add(new DoubleTest("0x0.8p1025d", 0x7ff0000000000000L)); |
137 |
x.add(new DoubleTest("0x0.8p-1021d", 0x0010000000000000L)); |
138 |
x.add(new DoubleTest("0x0.8p-1022d", 0x0008000000000000L)); |
139 |
x.add(new DoubleTest("0x0.8p-1023d", 0x0004000000000000L)); |
140 |
x.add(new DoubleTest("0x0.8p-1024d", 0x0002000000000000L)); |
141 |
x.add(new DoubleTest("0x0.8p-1074d", 0x7ff8000000000000L)); |
142 |
x.add(new DoubleTest("0x0.8p-1075d", 0x7ff8000000000000L)); |
143 |
x.add(new DoubleTest("0x0.8p-1076d", 0x7ff8000000000000L)); |
144 |
x.add(new DoubleTest("0x0.4p-1021d", 0x0008000000000000L)); |
145 |
x.add(new DoubleTest("0x0.4p-1022d", 0x0004000000000000L)); |
146 |
x.add(new DoubleTest("0x0.4p-1023d", 0x0002000000000000L)); |
147 |
x.add(new DoubleTest("0x0.4p-1073d", 0x7ff8000000000000L)); |
148 |
x.add(new DoubleTest("0x0.4p-1074d", 0x7ff8000000000000L)); |
149 |
x.add(new DoubleTest("0x0.4p-1075d", 0x7ff8000000000000L)); |
150 |
x.add(new DoubleTest("0x0.2p-1020d", 0x0008000000000000L)); |
151 |
x.add(new DoubleTest("0x0.2p-1021d", 0x0004000000000000L)); |
152 |
x.add(new DoubleTest("0x0.2p-1022d", 0x0002000000000000L)); |
153 |
x.add(new DoubleTest("0x0.2p-1072d", 0x7ff8000000000000L)); |
154 |
x.add(new DoubleTest("0x0.2p-1073d", 0x7ff8000000000000L)); |
155 |
x.add(new DoubleTest("0x0.2p-1074d", 0x7ff8000000000000L)); |
156 |
x.add(new DoubleTest("0x0.1p-1019d", 0x0008000000000000L)); |
157 |
x.add(new DoubleTest("0x0.1p-1020d", 0x0004000000000000L)); |
158 |
x.add(new DoubleTest("0x0.1p-1021d", 0x0002000000000000L)); |
159 |
x.add(new DoubleTest("0x0.1p-1071d", 0x7ff8000000000000L)); |
160 |
x.add(new DoubleTest("0x0.1p-1072d", 0x7ff8000000000000L)); |
161 |
x.add(new DoubleTest("0x0.1p-1073d", 0x7ff8000000000000L)); |
162 |
|
163 |
for (Iterator it = x.iterator(); it.hasNext();) { |
164 |
DoubleTest t = (DoubleTest) it.next(); |
165 |
String s = t.input; |
166 |
long expectedBits = t.output; |
167 |
double libExpected = 0.0d; |
168 |
if (isJ2SE5) { |
169 |
// note that next line only works with a 1.5 J2SE |
170 |
libExpected = Double.parseDouble(s); |
171 |
} |
172 |
double dActual = FloatUtil.valueOfHexDoubleLiteral(s.toCharArray()); |
173 |
long actualBits = Double.doubleToLongBits(dActual); |
174 |
if (isJ2SE5) { |
175 |
// cross-check bits computed by J2SE 1.5 library |
176 |
long libExpectedBits = Double.doubleToRawLongBits(libExpected); |
177 |
if (expectedBits != libExpectedBits) { |
178 |
if (Double.isNaN(Double.longBitsToDouble(expectedBits)) && libExpected == 0.0d) { |
179 |
// this is ok - we return NaN where lib quietly underflows to 0 |
180 |
} else { |
181 |
assertEquals("Test has wrong table value for " + s, libExpectedBits, expectedBits); |
182 |
} |
183 |
} |
184 |
} |
185 |
assertEquals("Wrong double value for " + s, expectedBits, actualBits); |
186 |
} |
187 |
} |
188 |
|
189 |
/** |
190 |
*/ |
191 |
public void test002() { |
192 |
List x = new ArrayList(); |
193 |
// various forms of zero |
194 |
x.add(new FloatTest("0x0p0f", 0x0)); |
195 |
x.add(new FloatTest("0x0p0F", 0x0)); |
196 |
x.add(new FloatTest("0x0.0p0F", 0x0)); |
197 |
x.add(new FloatTest("0x.0p0F", 0x0)); |
198 |
x.add(new FloatTest("0x0.p0F", 0x0)); |
199 |
x.add(new FloatTest("0x00000.00000000000p0F", 0x0)); |
200 |
x.add(new FloatTest("0x0p99F", 0x0)); |
201 |
x.add(new FloatTest("0x0p-99F", 0x0)); |
202 |
x.add(new FloatTest("0x0p9999999F", 0x0)); |
203 |
x.add(new FloatTest("0x0p-9999999F", 0x0)); |
204 |
|
205 |
// small floats |
206 |
x.add(new FloatTest("0x0.8p0F", 0x3f000000)); |
207 |
x.add(new FloatTest("0x0.4p0F", 0x3e800000)); |
208 |
x.add(new FloatTest("0x0.2p0F", 0x3e000000)); |
209 |
x.add(new FloatTest("0x0.1p0F", 0x3d800000)); |
210 |
x.add(new FloatTest("0x0.08p0F", 0x3d000000)); |
211 |
x.add(new FloatTest("0x0.04p0F", 0x3c800000)); |
212 |
x.add(new FloatTest("0x0.02p0F", 0x3c000000)); |
213 |
x.add(new FloatTest("0x0.01p0F", 0x3b800000)); |
214 |
x.add(new FloatTest("0x0.010p0F", 0x3b800000)); |
215 |
x.add(new FloatTest("0x1p0F", 0x3f800000)); |
216 |
x.add(new FloatTest("0x2p0F", 0x40000000)); |
217 |
x.add(new FloatTest("0x4p0F", 0x40800000)); |
218 |
x.add(new FloatTest("0x8p0F", 0x41000000)); |
219 |
x.add(new FloatTest("0x10p0F", 0x41800000)); |
220 |
x.add(new FloatTest("0x20p0F", 0x42000000)); |
221 |
x.add(new FloatTest("0x40p0F", 0x42800000)); |
222 |
x.add(new FloatTest("0x80p0F", 0x43000000)); |
223 |
x.add(new FloatTest("0x80.p0F", 0x43000000)); |
224 |
x.add(new FloatTest("0x80.8p0F", 0x43008000)); |
225 |
x.add(new FloatTest("0x80.80p0F", 0x43008000)); |
226 |
x.add(new FloatTest("0x123456789p0F", 0x4f91a2b4)); |
227 |
x.add(new FloatTest("0xabcedfp0F", 0x4b2bcedf)); |
228 |
x.add(new FloatTest("0xABCDEFp0F", 0x4b2bcdef)); |
229 |
|
230 |
x.add(new FloatTest("0x0.000000000000000000000000000001p0f", 0x3800000)); |
231 |
x.add(new FloatTest("0x10000000000000000000000000000000p0f", 0x7d800000)); |
232 |
|
233 |
// rounding to 24 bits |
234 |
x.add(new FloatTest("0x823456p0f", 0x4b023456)); |
235 |
x.add(new FloatTest("0xFFFFFF80p0f", 0x4f800000)); |
236 |
x.add(new FloatTest("0xFFFFFF40p0f", 0x4f7fffff)); |
237 |
x.add(new FloatTest("0xFFFFFF20p0f", 0x4f7fffff)); |
238 |
x.add(new FloatTest("0x123456p0f", 0x4991a2b0)); |
239 |
x.add(new FloatTest("0x7890abp0f", 0x4af12156)); |
240 |
x.add(new FloatTest("0xcdefABp0f", 0x4b4defab)); |
241 |
x.add(new FloatTest("0xCDEFdep0f", 0x4b4defde)); |
242 |
x.add(new FloatTest("0x123456p0f", 0x4991a2b0)); |
243 |
x.add(new FloatTest("0x7FFFFF8p0f", 0x4cffffff)); |
244 |
x.add(new FloatTest("0x3FFFFFCp0f", 0x4c7fffff)); |
245 |
x.add(new FloatTest("0x1FFFFFEp0f", 0x4bffffff)); |
246 |
|
247 |
// rounding to overflow at +128; denormalized at -126; underflow at -150 |
248 |
x.add(new FloatTest("0x1p5000F", 0x7f800000)); |
249 |
x.add(new FloatTest("0x1p-5000F", 0x7fc00000)); |
250 |
x.add(new FloatTest("0x1.0p126f", 0x7e800000)); |
251 |
x.add(new FloatTest("0x1.0p127f", 0x7f000000)); |
252 |
x.add(new FloatTest("0x1.0p128f", 0x7f800000)); |
253 |
x.add(new FloatTest("0x1.0p129f", 0x7f800000)); |
254 |
x.add(new FloatTest("0x1.0p-127f", 0x00400000)); |
255 |
x.add(new FloatTest("0x1.0p-128f", 0x00200000)); |
256 |
x.add(new FloatTest("0x1.0p-129f", 0x00100000)); |
257 |
x.add(new FloatTest("0x1.0p-149f", 0x00000001)); |
258 |
x.add(new FloatTest("0x1.0p-150f", 0x7fc00000)); |
259 |
x.add(new FloatTest("0x1.0p-151f", 0x7fc00000)); |
260 |
x.add(new FloatTest("0x0.8p127f", 0x7e800000)); |
261 |
x.add(new FloatTest("0x0.8p128f", 0x7f000000)); |
262 |
x.add(new FloatTest("0x0.8p129f", 0x7f800000)); |
263 |
x.add(new FloatTest("0x0.8p-125f", 0x00800000)); |
264 |
x.add(new FloatTest("0x0.8p-126f", 0x00400000)); |
265 |
x.add(new FloatTest("0x0.8p-127f", 0x00200000)); |
266 |
x.add(new FloatTest("0x0.8p-128f", 0x00100000)); |
267 |
x.add(new FloatTest("0x0.8p-148f", 0x00000001)); |
268 |
x.add(new FloatTest("0x0.8p-149f", 0x7fc00000)); |
269 |
x.add(new FloatTest("0x0.8p-150f", 0x7fc00000)); |
270 |
x.add(new FloatTest("0x0.4p-124f", 0x00800000)); |
271 |
x.add(new FloatTest("0x0.4p-125f", 0x00400000)); |
272 |
x.add(new FloatTest("0x0.4p-126f", 0x00200000)); |
273 |
x.add(new FloatTest("0x0.4p-147f", 0x00000001)); |
274 |
x.add(new FloatTest("0x0.4p-148f", 0x7fc00000)); |
275 |
x.add(new FloatTest("0x0.4p-149f", 0x7fc00000)); |
276 |
x.add(new FloatTest("0x0.4p-150f", 0x7fc00000)); |
277 |
x.add(new FloatTest("0x0.2p-123f", 0x00800000)); |
278 |
x.add(new FloatTest("0x0.2p-124f", 0x00400000)); |
279 |
x.add(new FloatTest("0x0.2p-125f", 0x00200000)); |
280 |
x.add(new FloatTest("0x0.2p-126f", 0x00100000)); |
281 |
x.add(new FloatTest("0x0.2p-146f", 0x00000001)); |
282 |
x.add(new FloatTest("0x0.2p-147f", 0x7fc00000)); |
283 |
x.add(new FloatTest("0x0.2p-148f", 0x7fc00000)); |
284 |
x.add(new FloatTest("0x0.2p-149f", 0x7fc00000)); |
285 |
x.add(new FloatTest("0x0.1p-122f", 0x00800000)); |
286 |
x.add(new FloatTest("0x0.1p-123f", 0x00400000)); |
287 |
x.add(new FloatTest("0x0.1p-124f", 0x00200000)); |
288 |
x.add(new FloatTest("0x0.1p-145f", 0x00000001)); |
289 |
x.add(new FloatTest("0x0.1p-146f", 0x7fc00000)); |
290 |
x.add(new FloatTest("0x0.1p-147f", 0x7fc00000)); |
291 |
x.add(new FloatTest("0x0.1p-148f", 0x7fc00000)); |
292 |
|
293 |
for (Iterator it = x.iterator(); it.hasNext();) { |
294 |
FloatTest t = (FloatTest) it.next(); |
295 |
String s = t.input; |
296 |
int expectedBits = t.output; |
297 |
float libExpected = 0.0f; |
298 |
if (isJ2SE5) { |
299 |
// note that next line only works with a 1.5 J2SE |
300 |
libExpected = Float.parseFloat(s); |
301 |
} |
302 |
float dActual = FloatUtil.valueOfHexFloatLiteral(s.toCharArray()); |
303 |
long actualBits = Float.floatToIntBits(dActual); |
304 |
if (isJ2SE5) { |
305 |
// cross-check bits computed by J2SE 1.5 library |
306 |
int libExpectedBits = Float.floatToRawIntBits(libExpected); |
307 |
if (expectedBits != libExpectedBits) { |
308 |
if (Float.isNaN(Float.intBitsToFloat(expectedBits)) && libExpected == 0.0f) { |
309 |
// this is ok - we return NaN where lib quietly underflows to 0 |
310 |
} else { |
311 |
assertEquals("Test has wrong table value for " + s, libExpectedBits, expectedBits); |
312 |
} |
313 |
} |
314 |
} |
315 |
assertEquals("Wrong float value for " + s, expectedBits, actualBits); |
316 |
} |
317 |
} |
318 |
|
319 |
} |