View | Details | Raw Unified | Return to bug 74126 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/jdt/core/tests/compiler/regression/InternalHexFloatTest.java (+319 lines)
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
}

Return to bug 74126