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 /lib/testlibrary 29 * @build jdk.testlibrary.FloatUtils 30 * @run main BitwiseConversion 31 * @author Joseph D. Darcy 32 */ 33 34 import static java.lang.Float.*; 35 import static jdk.testlibrary.FloatUtils.*; 36 37 public class BitwiseConversion { 38 static int testNanCase(int x) { 39 int errors = 0; 40 // Strip out sign and exponent bits 41 int y = x & SIGNIF_BIT_MASK; 42 43 float values[] = { 44 intBitsToFloat(EXP_BIT_MASK | y), 45 intBitsToFloat(SIGN_BIT_MASK | EXP_BIT_MASK | y) 46 }; 47 48 for(float value: values) { 49 if (!isNaN(value)) { 50 throw new RuntimeException("Invalid input " + y + 51 "yielded non-NaN" + value); 52 } 53 int converted = floatToIntBits(value); 54 if (converted != 0x7fc00000) { 55 errors++; 56 System.err.format("Non-canoncial NaN bits returned: %x%n", 57 converted); 58 } 59 } 60 return errors; 61 } 62 63 public static void main(String... argv) { 64 int errors = 0; 65 66 for (int i = 0; i < SIGNIFICAND_WIDTH-1; i++) { 67 errors += testNanCase(1<<i); 68 } 69 70 if (floatToIntBits(Float.POSITIVE_INFINITY) 71 != 0x7F800000) { 72 errors++; 73 System.err.println("Bad conversion for +infinity."); 74 } 75 76 if (floatToIntBits(Float.NEGATIVE_INFINITY) 77 != 0xFF800000) { 78 errors++; 79 System.err.println("Bad conversion for -infinity."); 80 } 81 82 if (errors > 0) 83 throw new RuntimeException(); 84 } 85 }