• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2005, 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 5037596
27  * @summary Verify bitwise conversion works for non-canonical NaN values
28  * @library ../Math
29  * @build DoubleConsts
30  * @run main BitwiseConversion
31  * @author Joseph D. Darcy
32  */
33 
34 package test.java.lang.Double;
35 
36 import static java.lang.Double.*;
37 
38 import jdk.internal.math.DoubleConsts;
39 
40 public class BitwiseConversion {
testNanCase(long x)41     static int testNanCase(long x) {
42         int errors  = 0;
43         // Strip out sign and exponent bits
44         long y = x & DoubleConsts.SIGNIF_BIT_MASK;
45 
46         double values[] = {
47             longBitsToDouble(DoubleConsts.EXP_BIT_MASK | y),
48             longBitsToDouble(DoubleConsts.SIGN_BIT_MASK | DoubleConsts.EXP_BIT_MASK | y)
49         };
50 
51         for(double value: values) {
52             if (!isNaN(value)) {
53                 throw new RuntimeException("Invalid input " + y +
54                                            "yielded non-NaN" + value);
55             }
56             long converted = doubleToLongBits(value);
57             if (converted != 0x7ff8000000000000L) {
58                 errors++;
59                 System.err.format("Non-canoncial NaN bits returned: %x%n",
60                                   converted);
61             }
62         }
63         return errors;
64     }
65 
main(String... argv)66     public static void main(String... argv) {
67         int errors = 0;
68 
69         for (int i = 0; i < DoubleConsts.SIGNIFICAND_WIDTH-1; i++) {
70             errors += testNanCase(1L<<i);
71         }
72 
73         if (doubleToLongBits(Double.POSITIVE_INFINITY)
74                 != 0x7ff0000000000000L) {
75             errors++;
76             System.err.println("Bad conversion for +infinity.");
77         }
78 
79         if (doubleToLongBits(Double.NEGATIVE_INFINITY)
80                 != 0xfff0000000000000L) {
81             errors++;
82             System.err.println("Bad conversion for -infinity.");
83         }
84 
85         if (errors > 0)
86             throw new RuntimeException();
87     }
88 }
89