--- /dev/null Mon Jan 26 16:13:59 2009 +++ new/test/java/math/BigDecimal/FloatDoubleValueTests.java Mon Jan 26 16:13:58 2009 @@ -0,0 +1,164 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6274390 + * @summary Verify {float, double}Value methods work with condensed representation + */ +import java.math.*; + +public class FloatDoubleValueTests { + private static final long two2the24 = 1L<<23; + private static final long two2the53 = 1L<<52; + + // Largest long that fits exactly in a float + private static final long maxFltLong = (long)(Integer.MAX_VALUE & ~(0xff)); + + // Largest long that fits exactly in a double + private static final long maxDblLong = Long.MAX_VALUE & ~(0x7ffL); + + static void testDoubleValue0(long i, BigDecimal bd) { + if (bd.doubleValue() != i || + bd.longValue() != i) + throw new RuntimeException("Unexpected equality failure for " + + i + "\t" + bd); + } + + static void testFloatValue0(long i, BigDecimal bd) { + if (bd.floatValue() != i || + bd.longValue() != i) + throw new RuntimeException("Unexpected equality failure for " + + i + "\t" + bd); + } + + static void checkFloat(BigDecimal bd, float f) { + float fbd = bd.floatValue(); + if (f != fbd ) { + String message = String.format("Bad conversion:"+ + "got %g (%a)\texpected %g (%a)", + f, f, fbd, fbd); + throw new RuntimeException(message); + } + } + + static void checkDouble(BigDecimal bd, double d) { + double dbd = bd.doubleValue(); + if (d != dbd ) { + String message = String.format("Bad conversion:"+ + "got %g (%a)\texpected %g (%a)", + d, d, dbd, dbd); + throw new RuntimeException(message); + } + } + + // Test integral values that will convert exactly to both float + // and double. + static void testFloatDoubleValue() { + long longValues[] = { + 0, + 1, + 2, + + two2the24-1, + two2the24, + two2the24+1, + + maxFltLong-1, + maxFltLong, + maxFltLong+1, + }; + + for(long i : longValues) { + BigDecimal bd1 = new BigDecimal(i); + BigDecimal bd2 = new BigDecimal(-i); + + testDoubleValue0( i, bd1); + testDoubleValue0(-i, bd2); + + testFloatValue0( i, bd1); + testFloatValue0(-i, bd2); + } + + } + + static void testDoubleValue() { + long longValues[] = { + Integer.MAX_VALUE-1, + Integer.MAX_VALUE, + (long)Integer.MAX_VALUE+1, + + two2the53-1, + two2the53, + two2the53+1, + + maxDblLong, + }; + + // Test integral values that will convert exactly to double + // but not float. + for(long i : longValues) { + BigDecimal bd1 = new BigDecimal(i); + BigDecimal bd2 = new BigDecimal(-i); + + testDoubleValue0( i, bd1); + testDoubleValue0(-i, bd2); + + checkFloat(bd1, (float)i); + checkFloat(bd2, -(float)i); + } + + // Now check values that should not convert the same in double + for(long i = maxDblLong; i < Long.MAX_VALUE; i++) { + BigDecimal bd1 = new BigDecimal(i); + BigDecimal bd2 = new BigDecimal(-i); + checkDouble(bd1, (double)i); + checkDouble(bd2, -(double)i); + + checkFloat(bd1, (float)i); + checkFloat(bd2, -(float)i); + } + + checkDouble(new BigDecimal(Long.MIN_VALUE), (double)Long.MIN_VALUE); + checkDouble(new BigDecimal(Long.MAX_VALUE), (double)Long.MAX_VALUE); + } + + static void testFloatValue() { + // Now check values that should not convert the same in float + for(long i = maxFltLong; i <= Integer.MAX_VALUE; i++) { + BigDecimal bd1 = new BigDecimal(i); + BigDecimal bd2 = new BigDecimal(-i); + checkFloat(bd1, (float)i); + checkFloat(bd2, -(float)i); + + testDoubleValue0( i, bd1); + testDoubleValue0(-i, bd2); + } + } + + public static void main(String[] args) throws Exception { + testFloatDoubleValue(); + testDoubleValue(); + testFloatValue(); + } +}