1/*
2 * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 4347132 8136799
27 * @key randomness
28 * @library /test/lib
29 * @build jdk.test.lib.RandomFactory
30 * @build Tests
31 * @build FdlibmTranslit
32 * @build CubeRootTests
33 * @run main CubeRootTests
34 * @summary Tests specifically for StrictMath.cbrt
35 * @author Joseph D. Darcy
36 */
37
38import jdk.test.lib.RandomFactory;
39
40/**
41 * The tests in ../Math/CubeRootTests.java test properties that should
42 * hold for any cube root implementation, including the FDLIBM-based
43 * one required for StrictMath.cbrt.  Therefore, the test cases in
44 * ../Math/CubeRootTests.java are run against both the Math and
45 * StrictMath versions of cube root.  The role of this test is to
46 * verify that the FDLIBM cbrt algorithm is being used by running
47 * golden file tests on values that may vary from one conforming cube
48 * root implementation to another.
49 */
50
51public class CubeRootTests {
52    private CubeRootTests(){}
53
54    public static void main(String [] argv) {
55        int failures = 0;
56
57        failures += testCubeRoot();
58        failures += testAgainstTranslit();
59
60        if (failures > 0) {
61            System.err.println("Testing the cube root incurred "
62                               + failures + " failures.");
63            throw new RuntimeException();
64        }
65    }
66
67    static int testCubeRootCase(double input, double expected) {
68        int failures=0;
69
70        double minus_input = -input;
71        double minus_expected = -expected;
72
73        failures+=Tests.test("StrictMath.cbrt(double)", input,
74                             StrictMath.cbrt(input), expected);
75        failures+=Tests.test("StrictMath.cbrt(double)", minus_input,
76                             StrictMath.cbrt(minus_input), minus_expected);
77        return failures;
78    }
79
80    static int testCubeRoot() {
81        int failures = 0;
82        double [][] testCases = {
83            {0x1.ffffffffffffep-766,    0x1.fffffffffffffp-256},
84            {0x1.ffffffffffffep-763,    0x1.fffffffffffffp-255},
85            {0x1.ffffffffffffep-760,    0x1.fffffffffffffp-254},
86            {0x1.ffffffffffffep-757,    0x1.fffffffffffffp-253},
87            {0x1.ffffffffffffep-754,    0x1.fffffffffffffp-252},
88            {0x1.ffffffffffffep-751,    0x1.fffffffffffffp-251},
89            {0x1.ffffffffffffep-748,    0x1.fffffffffffffp-250},
90            {0x1.ffffffffffffep-745,    0x1.fffffffffffffp-249},
91            {0x1.ffffffffffffep-742,    0x1.fffffffffffffp-248},
92            {0x1.ffffffffffffep-739,    0x1.fffffffffffffp-247},
93            {0x1.ffffffffffffep-1006,   0x1.fffffffffffffp-336},
94            {0x1.ffffffffffffep-736,    0x1.fffffffffffffp-246},
95            {0x1.ffffffffffffep-733,    0x1.fffffffffffffp-245},
96            {0x1.ffffffffffffep-730,    0x1.fffffffffffffp-244},
97            {0x1.ffffffffffffep-727,    0x1.fffffffffffffp-243},
98            {0x1.ffffffffffffep-724,    0x1.fffffffffffffp-242},
99            {0x1.ffffffffffffep-721,    0x1.fffffffffffffp-241},
100            {0x1.ffffffffffffep-718,    0x1.fffffffffffffp-240},
101            {0x1.ffffffffffffep-715,    0x1.fffffffffffffp-239},
102            {0x1.ffffffffffffep-712,    0x1.fffffffffffffp-238},
103            {0x1.ffffffffffffep-709,    0x1.fffffffffffffp-237},
104            {0x1.ffffffffffffep-706,    0x1.fffffffffffffp-236},
105            {0x1.ffffffffffffep-703,    0x1.fffffffffffffp-235},
106            {0x1.ffffffffffffep-700,    0x1.fffffffffffffp-234},
107            {0x1.ffffffffffffep-697,    0x1.fffffffffffffp-233},
108            {0x1.ffffffffffffep-694,    0x1.fffffffffffffp-232},
109            {0x1.ffffffffffffep-691,    0x1.fffffffffffffp-231},
110            {0x1.ffffffffffffep-1003,   0x1.fffffffffffffp-335},
111            {0x1.ffffffffffffep-688,    0x1.fffffffffffffp-230},
112            {0x1.ffffffffffffep-685,    0x1.fffffffffffffp-229},
113            {0x1.ffffffffffffep-682,    0x1.fffffffffffffp-228},
114            {0x1.ffffffffffffep-679,    0x1.fffffffffffffp-227},
115            {0x1.ffffffffffffep-676,    0x1.fffffffffffffp-226},
116            {0x1.ffffffffffffep-673,    0x1.fffffffffffffp-225},
117            {0x1.ffffffffffffep-670,    0x1.fffffffffffffp-224},
118            {0x1.ffffffffffffep-667,    0x1.fffffffffffffp-223},
119            {0x1.ffffffffffffep-664,    0x1.fffffffffffffp-222},
120            {0x1.ffffffffffffep-661,    0x1.fffffffffffffp-221},
121            {0x1.ffffffffffffep-658,    0x1.fffffffffffffp-220},
122            {0x1.ffffffffffffep-655,    0x1.fffffffffffffp-219},
123            {0x1.ffffffffffffep-652,    0x1.fffffffffffffp-218},
124            {0x1.ffffffffffffep-649,    0x1.fffffffffffffp-217},
125            {0x1.ffffffffffffep-646,    0x1.fffffffffffffp-216},
126            {0x1.ffffffffffffep-643,    0x1.fffffffffffffp-215},
127            {0x1.ffffffffffffep-1000,   0x1.fffffffffffffp-334},
128            {0x1.ffffffffffffep-640,    0x1.fffffffffffffp-214},
129            {0x1.ffffffffffffep-637,    0x1.fffffffffffffp-213},
130            {0x1.ffffffffffffep-634,    0x1.fffffffffffffp-212},
131            {0x1.ffffffffffffep-631,    0x1.fffffffffffffp-211},
132            {0x1.ffffffffffffep-628,    0x1.fffffffffffffp-210},
133            {0x1.ffffffffffffep-625,    0x1.fffffffffffffp-209},
134            {0x1.ffffffffffffep-622,    0x1.fffffffffffffp-208},
135            {0x1.ffffffffffffep-619,    0x1.fffffffffffffp-207},
136            {0x1.ffffffffffffep-616,    0x1.fffffffffffffp-206},
137            {0x1.ffffffffffffep-613,    0x1.fffffffffffffp-205},
138            {0x1.ffffffffffffep-610,    0x1.fffffffffffffp-204},
139            {0x1.ffffffffffffep-607,    0x1.fffffffffffffp-203},
140            {0x1.ffffffffffffep-604,    0x1.fffffffffffffp-202},
141            {0x1.ffffffffffffep-601,    0x1.fffffffffffffp-201},
142            {0x1.ffffffffffffep-598,    0x1.fffffffffffffp-200},
143            {0x1.ffffffffffffep-595,    0x1.fffffffffffffp-199},
144            {0x1.ffffffffffffep-997,    0x1.fffffffffffffp-333},
145            {0x1.ffffffffffffep-592,    0x1.fffffffffffffp-198},
146            {0x1.ffffffffffffep-589,    0x1.fffffffffffffp-197},
147            {0x1.ffffffffffffep-586,    0x1.fffffffffffffp-196},
148            {0x1.ffffffffffffep-583,    0x1.fffffffffffffp-195},
149            {0x1.ffffffffffffep-580,    0x1.fffffffffffffp-194},
150            {0x1.ffffffffffffep-577,    0x1.fffffffffffffp-193},
151            {0x1.ffffffffffffep-574,    0x1.fffffffffffffp-192},
152            {0x1.ffffffffffffep-571,    0x1.fffffffffffffp-191},
153            {0x1.ffffffffffffep-568,    0x1.fffffffffffffp-190},
154            {0x1.ffffffffffffep-565,    0x1.fffffffffffffp-189},
155            {0x1.ffffffffffffep-562,    0x1.fffffffffffffp-188},
156            {0x1.ffffffffffffep-559,    0x1.fffffffffffffp-187},
157            {0x1.ffffffffffffep-556,    0x1.fffffffffffffp-186},
158            {0x1.ffffffffffffep-553,    0x1.fffffffffffffp-185},
159            {0x1.ffffffffffffep-550,    0x1.fffffffffffffp-184},
160            {0x1.ffffffffffffep-547,    0x1.fffffffffffffp-183},
161            {0x1.ffffffffffffep-994,    0x1.fffffffffffffp-332},
162            {0x1.ffffffffffffep-544,    0x1.fffffffffffffp-182},
163            {0x1.ffffffffffffep-541,    0x1.fffffffffffffp-181},
164            {0x1.ffffffffffffep-538,    0x1.fffffffffffffp-180},
165            {0x1.ffffffffffffep-535,    0x1.fffffffffffffp-179},
166            {0x1.ffffffffffffep-532,    0x1.fffffffffffffp-178},
167            {0x1.ffffffffffffep-529,    0x1.fffffffffffffp-177},
168            {0x0.00000000001fp-1022,    0x1.fa9c313858568p-356},
169            {0x1.ffffffffffffep-526,    0x1.fffffffffffffp-176},
170            {0x1.ffffffffffffep-523,    0x1.fffffffffffffp-175},
171            {0x1.ffffffffffffep-520,    0x1.fffffffffffffp-174},
172            {0x1.ffffffffffffep-517,    0x1.fffffffffffffp-173},
173            {0x0.00000000001fdp-1022,   0x1.feff7f94ea34dp-356},
174            {0x1.ffffffffffffep-514,    0x1.fffffffffffffp-172},
175            {0x0.00000001fffe7p-1022,   0x1.ffff7aaa87f1bp-352},
176            {0x0.00000001fffffp-1022,   0x1.fffffaaaaa9c7p-352},
177            {0x0.00001ffffff4p-1022,    0x1.ffffffcp-348},
178            {0x0.00001ffffffffp-1022,   0x1.ffffffffaaaabp-348},
179            {0x0.01ffffffffffcp-1022,   0x1.ffffffffffeabp-344},
180            {0x1.ffffffffffffep-511,    0x1.fffffffffffffp-171},
181            {0x1.ffffffffffffep-508,    0x1.fffffffffffffp-170},
182            {0x1.ffffffffffffep-505,    0x1.fffffffffffffp-169},
183            {0x1.ffffffffffffep-502,    0x1.fffffffffffffp-168},
184            {0x1.ffffffffffffep-499,    0x1.fffffffffffffp-167},
185            {0x1.ffffffffffffep-991,    0x1.fffffffffffffp-331},
186            {0x1.ffffffffffffep-496,    0x1.fffffffffffffp-166},
187            {0x1.ffffffffffffep-493,    0x1.fffffffffffffp-165},
188            {0x1.ffffffffffffep-490,    0x1.fffffffffffffp-164},
189            {0x1.ffffffffffffep-487,    0x1.fffffffffffffp-163},
190            {0x1.ffffffffffffep-484,    0x1.fffffffffffffp-162},
191            {0x1.ffffffffffffep-481,    0x1.fffffffffffffp-161},
192            {0x1.ffffffffffffep-478,    0x1.fffffffffffffp-160},
193            {0x1.ffffffffffffep-475,    0x1.fffffffffffffp-159},
194            {0x1.ffffffffffffep-472,    0x1.fffffffffffffp-158},
195            {0x1.ffffffffffffep-469,    0x1.fffffffffffffp-157},
196            {0x1.ffffffffffffep-466,    0x1.fffffffffffffp-156},
197            {0x1.ffffffffffffep-463,    0x1.fffffffffffffp-155},
198            {0x1.ffffffffffffep-460,    0x1.fffffffffffffp-154},
199            {0x1.ffffffffffffep-457,    0x1.fffffffffffffp-153},
200            {0x1.ffffffffffffep-454,    0x1.fffffffffffffp-152},
201            {0x1.ffffffffffffep-451,    0x1.fffffffffffffp-151},
202            {0x1.ffffffffffffep-988,    0x1.fffffffffffffp-330},
203            {0x1.ffffffffffffep-448,    0x1.fffffffffffffp-150},
204            {0x1.ffffffffffffep-445,    0x1.fffffffffffffp-149},
205            {0x1.ffffffffffffep-442,    0x1.fffffffffffffp-148},
206            {0x1.ffffffffffffep-439,    0x1.fffffffffffffp-147},
207            {0x1.ffffffffffffep-436,    0x1.fffffffffffffp-146},
208            {0x1.ffffffffffffep-433,    0x1.fffffffffffffp-145},
209            {0x1.ffffffffffffep-430,    0x1.fffffffffffffp-144},
210            {0x1.ffffffffffffep-427,    0x1.fffffffffffffp-143},
211            {0x1.ffffffffffffep-424,    0x1.fffffffffffffp-142},
212            {0x1.ffffffffffffep-421,    0x1.fffffffffffffp-141},
213            {0x1.ffffffffffffep-418,    0x1.fffffffffffffp-140},
214            {0x1.ffffffffffffep-415,    0x1.fffffffffffffp-139},
215            {0x1.ffffffffffffep-412,    0x1.fffffffffffffp-138},
216            {0x1.ffffffffffffep-409,    0x1.fffffffffffffp-137},
217            {0x1.ffffffffffffep-406,    0x1.fffffffffffffp-136},
218            {0x1.ffffffffffffep-403,    0x1.fffffffffffffp-135},
219            {0x1.ffffffffffffep-985,    0x1.fffffffffffffp-329},
220            {0x1.ffffffffffffep-400,    0x1.fffffffffffffp-134},
221            {0x1.ffffffffffffep-397,    0x1.fffffffffffffp-133},
222            {0x1.ffffffffffffep-394,    0x1.fffffffffffffp-132},
223            {0x1.ffffffffffffep-391,    0x1.fffffffffffffp-131},
224            {0x1.ffffffffffffep-388,    0x1.fffffffffffffp-130},
225            {0x1.ffffffffffffep-385,    0x1.fffffffffffffp-129},
226            {0x1.ffffffffffffep-382,    0x1.fffffffffffffp-128},
227            {0x1.ffffffffffffep-379,    0x1.fffffffffffffp-127},
228            {0x1.ffffffffffffep-376,    0x1.fffffffffffffp-126},
229            {0x1.ffffffffffffep-373,    0x1.fffffffffffffp-125},
230            {0x1.ffffffffffffep-370,    0x1.fffffffffffffp-124},
231            {0x1.ffffffffffffep-367,    0x1.fffffffffffffp-123},
232            {0x1.ffffffffffffep-364,    0x1.fffffffffffffp-122},
233            {0x1.ffffffffffffep-361,    0x1.fffffffffffffp-121},
234            {0x1.ffffffffffffep-358,    0x1.fffffffffffffp-120},
235            {0x1.ffffffffffffep-355,    0x1.fffffffffffffp-119},
236            {0x1.ffffffffffffep-982,    0x1.fffffffffffffp-328},
237            {0x1.ffffffffffffep-352,    0x1.fffffffffffffp-118},
238            {0x1.ffffffffffffep-349,    0x1.fffffffffffffp-117},
239            {0x1.ffffffffffffep-346,    0x1.fffffffffffffp-116},
240            {0x1.ffffffffffffep-343,    0x1.fffffffffffffp-115},
241            {0x1.ffffffffffffep-340,    0x1.fffffffffffffp-114},
242            {0x1.ffffffffffffep-337,    0x1.fffffffffffffp-113},
243            {0x1.ffffffffffffep-334,    0x1.fffffffffffffp-112},
244            {0x1.ffffffffffffep-331,    0x1.fffffffffffffp-111},
245            {0x1.ffffffffffffep-328,    0x1.fffffffffffffp-110},
246            {0x1.ffffffffffffep-325,    0x1.fffffffffffffp-109},
247            {0x1.ffffffffffffep-322,    0x1.fffffffffffffp-108},
248            {0x1.ffffffffffffep-319,    0x1.fffffffffffffp-107},
249            {0x1.ffffffffffffep-316,    0x1.fffffffffffffp-106},
250            {0x1.ffffffffffffep-313,    0x1.fffffffffffffp-105},
251            {0x1.ffffffffffffep-310,    0x1.fffffffffffffp-104},
252            {0x1.ffffffffffffep-307,    0x1.fffffffffffffp-103},
253            {0x1.ffffffffffffep-979,    0x1.fffffffffffffp-327},
254            {0x1.ffffffffffffep-304,    0x1.fffffffffffffp-102},
255            {0x1.ffffffffffffep-301,    0x1.fffffffffffffp-101},
256            {0x1.ffffffffffffep-298,    0x1.fffffffffffffp-100},
257            {0x1.ffffffffffffep-295,    0x1.fffffffffffffp-99},
258            {0x1.ffffffffffffep-292,    0x1.fffffffffffffp-98},
259            {0x1.ffffffffffffep-289,    0x1.fffffffffffffp-97},
260            {0x1.ffffffffffffep-286,    0x1.fffffffffffffp-96},
261            {0x1.ffffffffffffep-283,    0x1.fffffffffffffp-95},
262            {0x1.ffffffffffffep-280,    0x1.fffffffffffffp-94},
263            {0x1.ffffffffffffep-277,    0x1.fffffffffffffp-93},
264            {0x1.ffffffffffffep-274,    0x1.fffffffffffffp-92},
265            {0x1.ffffffffffffep-271,    0x1.fffffffffffffp-91},
266            {0x1.ffffffffffffep-268,    0x1.fffffffffffffp-90},
267            {0x1.ffffffffffffep-265,    0x1.fffffffffffffp-89},
268            {0x1.ffffffffffffep-262,    0x1.fffffffffffffp-88},
269            {0x1.ffffffffffffep-259,    0x1.fffffffffffffp-87},
270            {0x1.ffffffffffffep-1021,   0x1.fffffffffffffp-341},
271            {0x1.ffffffffffffep-976,    0x1.fffffffffffffp-326},
272            {0x1.ffffffffffffep-256,    0x1.fffffffffffffp-86},
273            {0x1.ffffffffffffep-253,    0x1.fffffffffffffp-85},
274            {0x1.ffffffffffffep-250,    0x1.fffffffffffffp-84},
275            {0x1.ffffffffffffep-247,    0x1.fffffffffffffp-83},
276            {0x1.ffffffffffffep-244,    0x1.fffffffffffffp-82},
277            {0x1.ffffffffffffep-241,    0x1.fffffffffffffp-81},
278            {0x1.ffffffffffffep-238,    0x1.fffffffffffffp-80},
279            {0x1.ffffffffffffep-235,    0x1.fffffffffffffp-79},
280            {0x1.ffffffffffffep-232,    0x1.fffffffffffffp-78},
281            {0x1.ffffffffffffep-229,    0x1.fffffffffffffp-77},
282            {0x1.ffffffffffffep-226,    0x1.fffffffffffffp-76},
283            {0x1.ffffffffffffep-223,    0x1.fffffffffffffp-75},
284            {0x1.ffffffffffffep-220,    0x1.fffffffffffffp-74},
285            {0x1.ffffffffffffep-217,    0x1.fffffffffffffp-73},
286            {0x1.ffffffffffffep-214,    0x1.fffffffffffffp-72},
287            {0x1.ffffffffffffep-211,    0x1.fffffffffffffp-71},
288            {0x1.ffffffffffffep-973,    0x1.fffffffffffffp-325},
289            {0x1.ffffffffffffep-208,    0x1.fffffffffffffp-70},
290            {0x1.ffffffffffffep-205,    0x1.fffffffffffffp-69},
291            {0x1.ffffffffffffep-202,    0x1.fffffffffffffp-68},
292            {0x1.ffffffffffffep-199,    0x1.fffffffffffffp-67},
293            {0x1.ffffffffffffep-196,    0x1.fffffffffffffp-66},
294            {0x1.ffffffffffffep-193,    0x1.fffffffffffffp-65},
295            {0x1.ffffffffffffep-190,    0x1.fffffffffffffp-64},
296            {0x1.ffffffffffffep-187,    0x1.fffffffffffffp-63},
297            {0x1.ffffffffffffep-184,    0x1.fffffffffffffp-62},
298            {0x1.ffffffffffffep-181,    0x1.fffffffffffffp-61},
299            {0x1.ffffffffffffep-178,    0x1.fffffffffffffp-60},
300            {0x1.ffffffffffffep-175,    0x1.fffffffffffffp-59},
301            {0x1.ffffffffffffep-172,    0x1.fffffffffffffp-58},
302            {0x1.ffffffffffffep-169,    0x1.fffffffffffffp-57},
303            {0x1.ffffffffffffep-166,    0x1.fffffffffffffp-56},
304            {0x1.ffffffffffffep-163,    0x1.fffffffffffffp-55},
305            {0x1.ffffffffffffep-970,    0x1.fffffffffffffp-324},
306            {0x1.ffffffffffffep-160,    0x1.fffffffffffffp-54},
307            {0x1.ffffffffffffep-157,    0x1.fffffffffffffp-53},
308            {0x1.ffffffffffffep-154,    0x1.fffffffffffffp-52},
309            {0x1.ffffffffffffep-151,    0x1.fffffffffffffp-51},
310            {0x1.ffffffffffffep-148,    0x1.fffffffffffffp-50},
311            {0x1.ffffffffffffep-145,    0x1.fffffffffffffp-49},
312            {0x1.ffffffffffffep-142,    0x1.fffffffffffffp-48},
313            {0x1.ffffffffffffep-139,    0x1.fffffffffffffp-47},
314            {0x1.ffffffffffffep-136,    0x1.fffffffffffffp-46},
315            {0x1.ffffffffffffep-133,    0x1.fffffffffffffp-45},
316            {0x1.ffffffffffffep-130,    0x1.fffffffffffffp-44},
317            {0x1.ffffffffffffep-127,    0x1.fffffffffffffp-43},
318            {0x1.ffffffffffffep-124,    0x1.fffffffffffffp-42},
319            {0x1.ffffffffffffep-121,    0x1.fffffffffffffp-41},
320            {0x1.ffffffffffffep-118,    0x1.fffffffffffffp-40},
321            {0x1.ffffffffffffep-115,    0x1.fffffffffffffp-39},
322            {0x1.ffffffffffffep-967,    0x1.fffffffffffffp-323},
323            {0x1.ffffffffffffep-112,    0x1.fffffffffffffp-38},
324            {0x1.ffffffffffffep-109,    0x1.fffffffffffffp-37},
325            {0x1.ffffffffffffep-106,    0x1.fffffffffffffp-36},
326            {0x1.ffffffffffffep-103,    0x1.fffffffffffffp-35},
327            {0x1.ffffffffffffep-100,    0x1.fffffffffffffp-34},
328            {0x1.ffffffffffffep-97,     0x1.fffffffffffffp-33},
329            {0x1.ffffffffffffep-94,     0x1.fffffffffffffp-32},
330            {0x1.ffffffffffffep-91,     0x1.fffffffffffffp-31},
331            {0x1.ffffffffffffep-88,     0x1.fffffffffffffp-30},
332            {0x1.ffffffffffffep-85,     0x1.fffffffffffffp-29},
333            {0x1.ffffffffffffep-82,     0x1.fffffffffffffp-28},
334            {0x1.ffffffffffffep-79,     0x1.fffffffffffffp-27},
335            {0x1.ffffffffffffep-76,     0x1.fffffffffffffp-26},
336            {0x1.ffffffffffffep-73,     0x1.fffffffffffffp-25},
337            {0x1.ffffffffffffep-70,     0x1.fffffffffffffp-24},
338            {0x1.ffffffffffffep-67,     0x1.fffffffffffffp-23},
339            {0x1.ffffffffffffep-964,    0x1.fffffffffffffp-322},
340            {0x1.ffffffffffffep-64,     0x1.fffffffffffffp-22},
341            {0x1.ffffffffffffep-61,     0x1.fffffffffffffp-21},
342            {0x1.ffffffffffffep-58,     0x1.fffffffffffffp-20},
343            {0x1.ffffffffffffep-55,     0x1.fffffffffffffp-19},
344            {0x1.ffffffffffffep-52,     0x1.fffffffffffffp-18},
345            {0x1.ffffffffffffep-49,     0x1.fffffffffffffp-17},
346            {0x1.ffffffffffffep-46,     0x1.fffffffffffffp-16},
347            {0x1.ffffffffffffep-43,     0x1.fffffffffffffp-15},
348            {0x1.ffffffffffffep-40,     0x1.fffffffffffffp-14},
349            {0x1.ffffffffffffep-37,     0x1.fffffffffffffp-13},
350            {0x1.ffffffffffffep-34,     0x1.fffffffffffffp-12},
351            {0x1.ffffffffffffep-31,     0x1.fffffffffffffp-11},
352            {0x1.ffffffffffffep-28,     0x1.fffffffffffffp-10},
353            {0x1.ffffffffffffep-25,     0x1.fffffffffffffp-9},
354            {0x1.ffffffffffffep-22,     0x1.fffffffffffffp-8},
355            {0x0.000000000003ep-1022,   0x1.fa9c313858568p-357},
356            {0x1.ffffffffffffep-19,     0x1.fffffffffffffp-7},
357            {0x1.ffffffffffffep-961,    0x1.fffffffffffffp-321},
358            {0x1.ffffffffffffep-16,     0x1.fffffffffffffp-6},
359            {0x1.ffffffffffffep-13,     0x1.fffffffffffffp-5},
360            {0x1.ffffffffffffep-10,     0x1.fffffffffffffp-4},
361            {0x1.ffffffffffffep-7,      0x1.fffffffffffffp-3},
362            {0x0.000000000003fp-1022,   0x1.fd51bf2069fe6p-357},
363            {0x1.ffffffffffffep-4,      0x1.fffffffffffffp-2},
364            {0x1.ffffffffffffep-1,      0x1.fffffffffffffp-1},
365            {0x0.000000003fffcp-1022,   0x1.ffff55551c71bp-353},
366            {0x0.000003fffffe8p-1022,   0x1.ffffffcp-349},
367            {0x0.000003ffffffcp-1022,   0x1.fffffff555555p-349},
368            {0x0.003fffffffff9p-1022,   0x1.fffffffffed55p-345},
369            {0x1.ffffffffffffep2,       0x1.fffffffffffffp0},
370            {0x1.bp4,                   0x1.8p1},
371            {0x1.ffffffffffffep5,       0x1.fffffffffffffp1},
372            {0x1.f3ffffffffff4p6,       0x1.3fffffffffffep2},
373            {0x1.f3ffffffffffcp6,       0x1.3ffffffffffffp2},
374            {0x1.bp7,                   0x1.8p2},
375            {0x1.56ffffffffffep8,       0x1.bffffffffffffp2},
376            {0x1.ffffffffffffep8,       0x1.fffffffffffffp2},
377            {0x1.6c8p9,                 0x1.2p3},
378            {0x1.f3ffffffffff4p9,       0x1.3fffffffffffep3},
379            {0x1.f3ffffffffffcp9,       0x1.3ffffffffffffp3},
380            {0x1.4cbfffffffffcp10,      0x1.5fffffffffffep3},
381            {0x1.4cbfffffffffep10,      0x1.5ffffffffffffp3},
382            {0x1.bp10,                  0x1.8p3},
383            {0x1.129ffffffffa4p11,      0x1.9ffffffffffd1p3},
384            {0x1.129fffffffffep11,      0x1.9ffffffffffffp3},
385            {0x1.56ffffffffffep11,      0x1.bffffffffffffp3},
386            {0x1.a5ep11,                0x1.ep3},
387            {0x1.ffffffffffffep11,      0x1.fffffffffffffp3},
388            {0x1.330fffffffc1ep12,      0x1.0fffffffffedbp4},
389            {0x1.331p12,                0x1.1p4},
390            {0x1.6c8p12,                0x1.2p4},
391            {0x1.acafffffffffap12,      0x1.2ffffffffffffp4},
392            {0x1.acafffffffffep12,      0x1.2ffffffffffffp4},
393            {0x1.ffffffffffffep-958,    0x1.fffffffffffffp-320},
394            {0x1.ffffffffffffep-955,    0x1.fffffffffffffp-319},
395            {0x1.ffffffffffffep-952,    0x1.fffffffffffffp-318},
396            {0x1.ffffffffffffep-949,    0x1.fffffffffffffp-317},
397            {0x1.ffffffffffffep-946,    0x1.fffffffffffffp-316},
398            {0x1.ffffffffffffep-943,    0x1.fffffffffffffp-315},
399            {0x1.ffffffffffffep-940,    0x1.fffffffffffffp-314},
400            {0x1.ffffffffffffep-937,    0x1.fffffffffffffp-313},
401            {0x1.ffffffffffffep-934,    0x1.fffffffffffffp-312},
402            {0x1.ffffffffffffep-931,    0x1.fffffffffffffp-311},
403            {0x1.ffffffffffffep-1018,   0x1.fffffffffffffp-340},
404            {0x1.ffffffffffffep-928,    0x1.fffffffffffffp-310},
405            {0x1.ffffffffffffep-925,    0x1.fffffffffffffp-309},
406            {0x1.ffffffffffffep-922,    0x1.fffffffffffffp-308},
407            {0x1.ffffffffffffep-919,    0x1.fffffffffffffp-307},
408            {0x1.ffffffffffffep-916,    0x1.fffffffffffffp-306},
409            {0x1.ffffffffffffep-913,    0x1.fffffffffffffp-305},
410            {0x1.ffffffffffffep-910,    0x1.fffffffffffffp-304},
411            {0x1.ffffffffffffep-907,    0x1.fffffffffffffp-303},
412            {0x1.ffffffffffffep-904,    0x1.fffffffffffffp-302},
413            {0x0.0000000000007p-1022,   0x1.e9b5dba58189ep-358},
414            {0x1.ffffffffffffep-901,    0x1.fffffffffffffp-301},
415            {0x1.ffffffffffffep-898,    0x1.fffffffffffffp-300},
416            {0x0.0000000007ffp-1022,    0x1.ffeaa9c70ca31p-354},
417            {0x0.0000000007ffep-1022,   0x1.fffd5551c7149p-354},
418            {0x0.0000007fffffdp-1022,   0x1.ffffffcp-350},
419            {0x0.0000007fffffep-1022,   0x1.ffffffd555555p-350},
420            {0x0.0007ffffffffap-1022,   0x1.fffffffff8p-346},
421            {0x0.7ffffffffffffp-1022,   0x1.fffffffffffffp-342},
422            {0x1.ffffffffffffep-895,    0x1.fffffffffffffp-299},
423            {0x1.ffffffffffffep-892,    0x1.fffffffffffffp-298},
424            {0x1.ffffffffffffep-889,    0x1.fffffffffffffp-297},
425            {0x1.ffffffffffffep-886,    0x1.fffffffffffffp-296},
426            {0x1.ffffffffffffep-883,    0x1.fffffffffffffp-295},
427            {0x1.ffffffffffffep-1015,   0x1.fffffffffffffp-339},
428            {0x1.ffffffffffffep-880,    0x1.fffffffffffffp-294},
429            {0x1.ffffffffffffep-877,    0x1.fffffffffffffp-293},
430            {0x1.ffffffffffffep-874,    0x1.fffffffffffffp-292},
431            {0x1.ffffffffffffep-871,    0x1.fffffffffffffp-291},
432            {0x1.ffffffffffffep-868,    0x1.fffffffffffffp-290},
433            {0x1.ffffffffffffep-865,    0x1.fffffffffffffp-289},
434            {0x1.ffffffffffffep-862,    0x1.fffffffffffffp-288},
435            {0x1.ffffffffffffep-859,    0x1.fffffffffffffp-287},
436            {0x1.ffffffffffffep-856,    0x1.fffffffffffffp-286},
437            {0x1.ffffffffffffep-853,    0x1.fffffffffffffp-285},
438            {0x1.ffffffffffffep-850,    0x1.fffffffffffffp-284},
439            {0x1.ffffffffffffep-847,    0x1.fffffffffffffp-283},
440            {0x1.ffffffffffffep-844,    0x1.fffffffffffffp-282},
441            {0x1.ffffffffffffep-841,    0x1.fffffffffffffp-281},
442            {0x1.ffffffffffffep-838,    0x1.fffffffffffffp-280},
443            {0x1.ffffffffffffep-835,    0x1.fffffffffffffp-279},
444            {0x1.ffffffffffffep-1012,   0x1.fffffffffffffp-338},
445            {0x1.ffffffffffffep-832,    0x1.fffffffffffffp-278},
446            {0x1.ffffffffffffep-829,    0x1.fffffffffffffp-277},
447            {0x1.ffffffffffffep-826,    0x1.fffffffffffffp-276},
448            {0x1.ffffffffffffep-823,    0x1.fffffffffffffp-275},
449            {0x1.ffffffffffffep-820,    0x1.fffffffffffffp-274},
450            {0x1.ffffffffffffep-817,    0x1.fffffffffffffp-273},
451            {0x1.ffffffffffffep-814,    0x1.fffffffffffffp-272},
452            {0x1.ffffffffffffep-811,    0x1.fffffffffffffp-271},
453            {0x1.ffffffffffffep-808,    0x1.fffffffffffffp-270},
454            {0x1.ffffffffffffep-805,    0x1.fffffffffffffp-269},
455            {0x1.ffffffffffffep-802,    0x1.fffffffffffffp-268},
456            {0x1.ffffffffffffep-799,    0x1.fffffffffffffp-267},
457            {0x1.ffffffffffffep-796,    0x1.fffffffffffffp-266},
458            {0x1.ffffffffffffep-793,    0x1.fffffffffffffp-265},
459            {0x1.ffffffffffffep-790,    0x1.fffffffffffffp-264},
460            {0x1.ffffffffffffep-787,    0x1.fffffffffffffp-263},
461            {0x1.ffffffffffffep-1009,   0x1.fffffffffffffp-337},
462            {0x1.ffffffffffffep-784,    0x1.fffffffffffffp-262},
463            {0x1.ffffffffffffep-781,    0x1.fffffffffffffp-261},
464            {0x1.ffffffffffffep-778,    0x1.fffffffffffffp-260},
465            {0x1.ffffffffffffep-775,    0x1.fffffffffffffp-259},
466            {0x1.ffffffffffffep-772,    0x1.fffffffffffffp-258},
467            {0x1.ffffffffffffep-769,    0x1.fffffffffffffp-257},
468            {0x0.0000000000ffep-1022,   0x1.ffeaa9c70ca31p-355},
469            {0x0.0000000000fffp-1022,   0x1.fff5551c6fcd6p-355},
470            {0x0.0000000ffff86p-1022,   0x1.ffffaeaa9dbf1p-351},
471            {0x0.0000000ffffffp-1022,   0x1.ffffff5555552p-351},
472            {0x0.0000ffffffap-1022,     0x1.ffffffcp-347},
473            {0x0.0000ffffffff8p-1022,   0x1.ffffffffaaaabp-347},
474            {0x0.0fffffffffffbp-1022,   0x1.fffffffffffcbp-343}
475        };
476
477        for(double[] testCase: testCases)
478            failures+=testCubeRootCase(testCase[0], testCase[1]);
479
480        return failures;
481    }
482
483    // Initialize shared random number generator
484    private static java.util.Random random = RandomFactory.getRandom();
485
486    /**
487     * Test StrictMath.cbrt against transliteration port of cbrt.
488     */
489    private static int testAgainstTranslit() {
490        int failures = 0;
491        double x;
492
493        // Test just above subnormal threshold...
494        x = Double.MIN_NORMAL;
495        failures += testRange(x, Math.ulp(x), 1000);
496
497        // ... and just below subnormal threshold ...
498        x =  Math.nextDown(Double.MIN_NORMAL);
499        failures += testRange(x, -Math.ulp(x), 1000);
500
501        // ... and near zero.
502        failures += testRange(0.0, Double.MIN_VALUE, 1000);
503
504        x = Tests.createRandomDouble(random);
505
506        // Make the increment twice the ulp value in case the random
507        // value is near an exponent threshold. Don't worry about test
508        // elements overflowing to infinity if the starting value is
509        // near Double.MAX_VALUE.
510        failures += testRange(x, 2.0 * Math.ulp(x), 1000);
511
512        return failures;
513    }
514
515    private static int testRange(double start, double increment, int count) {
516        int failures = 0;
517        double x = start;
518        for (int i = 0; i < count; i++, x += increment) {
519            failures += testCubeRootCase(x, FdlibmTranslit.Cbrt.compute(x));
520        }
521        return failures;
522    }
523}
524