--- old/src/share/classes/sun/misc/FpUtils.java 2011-09-16 18:10:39.000000000 -0700 +++ new/src/share/classes/sun/misc/FpUtils.java 2011-09-16 18:10:39.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. 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 @@ -125,10 +125,6 @@ */ private FpUtils() {} - // Constants used in scalb - static double twoToTheDoubleScaleUp = powerOfTwoD(512); - static double twoToTheDoubleScaleDown = powerOfTwoD(-512); - // Helper Methods // The following helper methods are used in the implementation of @@ -137,49 +133,22 @@ /** * Returns unbiased exponent of a {@code double}. + * @deprecated Use Math.getExponent. */ + @Deprecated public static int getExponent(double d){ - /* - * Bitwise convert d to long, mask out exponent bits, shift - * to the right and then subtract out double's bias adjust to - * get true exponent value. - */ - return (int)(((Double.doubleToRawLongBits(d) & DoubleConsts.EXP_BIT_MASK) >> - (DoubleConsts.SIGNIFICAND_WIDTH - 1)) - DoubleConsts.EXP_BIAS); + return Math.getExponent(d); } /** * Returns unbiased exponent of a {@code float}. + * @deprecated Use Math.getExponent. */ + @Deprecated public static int getExponent(float f){ - /* - * Bitwise convert f to integer, mask out exponent bits, shift - * to the right and then subtract out float's bias adjust to - * get true exponent value - */ - return ((Float.floatToRawIntBits(f) & FloatConsts.EXP_BIT_MASK) >> - (FloatConsts.SIGNIFICAND_WIDTH - 1)) - FloatConsts.EXP_BIAS; - } - - /** - * Returns a floating-point power of two in the normal range. - */ - static double powerOfTwoD(int n) { - assert(n >= DoubleConsts.MIN_EXPONENT && n <= DoubleConsts.MAX_EXPONENT); - return Double.longBitsToDouble((((long)n + (long)DoubleConsts.EXP_BIAS) << - (DoubleConsts.SIGNIFICAND_WIDTH-1)) - & DoubleConsts.EXP_BIT_MASK); + return Math.getExponent(f); } - /** - * Returns a floating-point power of two in the normal range. - */ - static float powerOfTwoF(int n) { - assert(n >= FloatConsts.MIN_EXPONENT && n <= FloatConsts.MAX_EXPONENT); - return Float.intBitsToFloat(((n + FloatConsts.EXP_BIAS) << - (FloatConsts.SIGNIFICAND_WIDTH-1)) - & FloatConsts.EXP_BIT_MASK); - } /** * Returns the first floating-point argument with the sign of the @@ -195,13 +164,11 @@ * @return a value with the magnitude of {@code magnitude} * and the sign of {@code sign}. * @author Joseph D. Darcy + * @deprecated Use Math.copySign. */ + @Deprecated public static double rawCopySign(double magnitude, double sign) { - return Double.longBitsToDouble((Double.doubleToRawLongBits(sign) & - (DoubleConsts.SIGN_BIT_MASK)) | - (Double.doubleToRawLongBits(magnitude) & - (DoubleConsts.EXP_BIT_MASK | - DoubleConsts.SIGNIF_BIT_MASK))); + return Math.copySign(magnitude, sign); } /** @@ -218,13 +185,11 @@ * @return a value with the magnitude of {@code magnitude} * and the sign of {@code sign}. * @author Joseph D. Darcy + * @deprecated Use Math.copySign. */ + @Deprecated public static float rawCopySign(float magnitude, float sign) { - return Float.intBitsToFloat((Float.floatToRawIntBits(sign) & - (FloatConsts.SIGN_BIT_MASK)) | - (Float.floatToRawIntBits(magnitude) & - (FloatConsts.EXP_BIT_MASK | - FloatConsts.SIGNIF_BIT_MASK))); + return Math.copySign(magnitude, sign); } /* ***************************************************************** */ @@ -558,82 +523,11 @@ * @param scale_factor power of 2 used to scale {@code d} * @return {@code d * }2{@code scale_factor} * @author Joseph D. Darcy + * @deprecated Use Math.scalb. */ + @Deprecated public static double scalb(double d, int scale_factor) { - /* - * This method does not need to be declared strictfp to - * compute the same correct result on all platforms. When - * scaling up, it does not matter what order the - * multiply-store operations are done; the result will be - * finite or overflow regardless of the operation ordering. - * However, to get the correct result when scaling down, a - * particular ordering must be used. - * - * When scaling down, the multiply-store operations are - * sequenced so that it is not possible for two consecutive - * multiply-stores to return subnormal results. If one - * multiply-store result is subnormal, the next multiply will - * round it away to zero. This is done by first multiplying - * by 2 ^ (scale_factor % n) and then multiplying several - * times by by 2^n as needed where n is the exponent of number - * that is a covenient power of two. In this way, at most one - * real rounding error occurs. If the double value set is - * being used exclusively, the rounding will occur on a - * multiply. If the double-extended-exponent value set is - * being used, the products will (perhaps) be exact but the - * stores to d are guaranteed to round to the double value - * set. - * - * It is _not_ a valid implementation to first multiply d by - * 2^MIN_EXPONENT and then by 2 ^ (scale_factor % - * MIN_EXPONENT) since even in a strictfp program double - * rounding on underflow could occur; e.g. if the scale_factor - * argument was (MIN_EXPONENT - n) and the exponent of d was a - * little less than -(MIN_EXPONENT - n), meaning the final - * result would be subnormal. - * - * Since exact reproducibility of this method can be achieved - * without any undue performance burden, there is no - * compelling reason to allow double rounding on underflow in - * scalb. - */ - - // magnitude of a power of two so large that scaling a finite - // nonzero value by it would be guaranteed to over or - // underflow; due to rounding, scaling down takes takes an - // additional power of two which is reflected here - final int MAX_SCALE = DoubleConsts.MAX_EXPONENT + -DoubleConsts.MIN_EXPONENT + - DoubleConsts.SIGNIFICAND_WIDTH + 1; - int exp_adjust = 0; - int scale_increment = 0; - double exp_delta = Double.NaN; - - // Make sure scaling factor is in a reasonable range - - if(scale_factor < 0) { - scale_factor = Math.max(scale_factor, -MAX_SCALE); - scale_increment = -512; - exp_delta = twoToTheDoubleScaleDown; - } - else { - scale_factor = Math.min(scale_factor, MAX_SCALE); - scale_increment = 512; - exp_delta = twoToTheDoubleScaleUp; - } - - // Calculate (scale_factor % +/-512), 512 = 2^9, using - // technique from "Hacker's Delight" section 10-2. - int t = (scale_factor >> 9-1) >>> 32 - 9; - exp_adjust = ((scale_factor + t) & (512 -1)) - t; - - d *= powerOfTwoD(exp_adjust); - scale_factor -= exp_adjust; - - while(scale_factor != 0) { - d *= exp_delta; - scale_factor -= scale_increment; - } - return d; + return Math.scalb(d, scale_factor); } /** @@ -667,28 +561,11 @@ * @param scale_factor power of 2 used to scale {@code f} * @return {@code f * }2{@code scale_factor} * @author Joseph D. Darcy + * @deprecated Use Math.scalb. */ - public static float scalb(float f, int scale_factor) { - // magnitude of a power of two so large that scaling a finite - // nonzero value by it would be guaranteed to over or - // underflow; due to rounding, scaling down takes takes an - // additional power of two which is reflected here - final int MAX_SCALE = FloatConsts.MAX_EXPONENT + -FloatConsts.MIN_EXPONENT + - FloatConsts.SIGNIFICAND_WIDTH + 1; - - // Make sure scaling factor is in a reasonable range - scale_factor = Math.max(Math.min(scale_factor, MAX_SCALE), -MAX_SCALE); - - /* - * Since + MAX_SCALE for float fits well within the double - * exponent range and + float -> double conversion is exact - * the multiplication below will be exact. Therefore, the - * rounding that occurs when the double product is cast to - * float will be the correctly rounded float result. Since - * all operations other than the final multiply will be exact, - * it is not necessary to declare this method strictfp. - */ - return (float)((double)f*powerOfTwoD(scale_factor)); + @Deprecated + public static float scalb(float f, int scale_factor) { + return Math.scalb(f, scale_factor); } /** @@ -730,65 +607,11 @@ * @return The floating-point number adjacent to {@code start} in the * direction of {@code direction}. * @author Joseph D. Darcy + * @deprecated Use Math.nextAfter */ + @Deprecated public static double nextAfter(double start, double direction) { - /* - * The cases: - * - * nextAfter(+infinity, 0) == MAX_VALUE - * nextAfter(+infinity, +infinity) == +infinity - * nextAfter(-infinity, 0) == -MAX_VALUE - * nextAfter(-infinity, -infinity) == -infinity - * - * are naturally handled without any additional testing - */ - - // First check for NaN values - if (isNaN(start) || isNaN(direction)) { - // return a NaN derived from the input NaN(s) - return start + direction; - } else if (start == direction) { - return direction; - } else { // start > direction or start < direction - // Add +0.0 to get rid of a -0.0 (+0.0 + -0.0 => +0.0) - // then bitwise convert start to integer. - long transducer = Double.doubleToRawLongBits(start + 0.0d); - - /* - * IEEE 754 floating-point numbers are lexicographically - * ordered if treated as signed- magnitude integers . - * Since Java's integers are two's complement, - * incrementing" the two's complement representation of a - * logically negative floating-point value *decrements* - * the signed-magnitude representation. Therefore, when - * the integer representation of a floating-point values - * is less than zero, the adjustment to the representation - * is in the opposite direction than would be expected at - * first . - */ - if (direction > start) { // Calculate next greater value - transducer = transducer + (transducer >= 0L ? 1L:-1L); - } else { // Calculate next lesser value - assert direction < start; - if (transducer > 0L) - --transducer; - else - if (transducer < 0L ) - ++transducer; - /* - * transducer==0, the result is -MIN_VALUE - * - * The transition from zero (implicitly - * positive) to the smallest negative - * signed magnitude value must be done - * explicitly. - */ - else - transducer = DoubleConsts.SIGN_BIT_MASK | 1L; - } - - return Double.longBitsToDouble(transducer); - } + return Math.nextAfter(start, direction); } /** @@ -830,65 +653,11 @@ * @return The floating-point number adjacent to {@code start} in the * direction of {@code direction}. * @author Joseph D. Darcy + * @deprecated Use Math.nextAfter. */ - public static float nextAfter(float start, double direction) { - /* - * The cases: - * - * nextAfter(+infinity, 0) == MAX_VALUE - * nextAfter(+infinity, +infinity) == +infinity - * nextAfter(-infinity, 0) == -MAX_VALUE - * nextAfter(-infinity, -infinity) == -infinity - * - * are naturally handled without any additional testing - */ - - // First check for NaN values - if (isNaN(start) || isNaN(direction)) { - // return a NaN derived from the input NaN(s) - return start + (float)direction; - } else if (start == direction) { - return (float)direction; - } else { // start > direction or start < direction - // Add +0.0 to get rid of a -0.0 (+0.0 + -0.0 => +0.0) - // then bitwise convert start to integer. - int transducer = Float.floatToRawIntBits(start + 0.0f); - - /* - * IEEE 754 floating-point numbers are lexicographically - * ordered if treated as signed- magnitude integers . - * Since Java's integers are two's complement, - * incrementing" the two's complement representation of a - * logically negative floating-point value *decrements* - * the signed-magnitude representation. Therefore, when - * the integer representation of a floating-point values - * is less than zero, the adjustment to the representation - * is in the opposite direction than would be expected at - * first. - */ - if (direction > start) {// Calculate next greater value - transducer = transducer + (transducer >= 0 ? 1:-1); - } else { // Calculate next lesser value - assert direction < start; - if (transducer > 0) - --transducer; - else - if (transducer < 0 ) - ++transducer; - /* - * transducer==0, the result is -MIN_VALUE - * - * The transition from zero (implicitly - * positive) to the smallest negative - * signed magnitude value must be done - * explicitly. - */ - else - transducer = FloatConsts.SIGN_BIT_MASK | 1; - } - - return Float.intBitsToFloat(transducer); - } + @Deprecated + public static float nextAfter(float start, double direction) { + return Math.nextAfter(start, direction); } /** @@ -915,15 +684,11 @@ * @return The adjacent floating-point value closer to positive * infinity. * @author Joseph D. Darcy + * @deprecated use Math.nextUp. */ + @Deprecated public static double nextUp(double d) { - if( isNaN(d) || d == Double.POSITIVE_INFINITY) - return d; - else { - d += 0.0d; - return Double.longBitsToDouble(Double.doubleToRawLongBits(d) + - ((d >= 0.0d)?+1L:-1L)); - } + return Math.nextUp(d); } /** @@ -950,15 +715,11 @@ * @return The adjacent floating-point value closer to positive * infinity. * @author Joseph D. Darcy + * @deprecated Use Math.nextUp. */ - public static float nextUp(float f) { - if( isNaN(f) || f == FloatConsts.POSITIVE_INFINITY) - return f; - else { - f += 0.0f; - return Float.intBitsToFloat(Float.floatToRawIntBits(f) + - ((f >= 0.0f)?+1:-1)); - } + @Deprecated + public static float nextUp(float f) { + return Math.nextUp(f); } /** @@ -1047,9 +808,11 @@ * and the sign of {@code sign}. * @author Joseph D. Darcy * @since 1.5 + * @deprecated Use StrictMath.copySign. */ + @Deprecated public static double copySign(double magnitude, double sign) { - return rawCopySign(magnitude, (isNaN(sign)?1.0d:sign)); + return StrictMath.copySign(magnitude, sign); } /** @@ -1063,9 +826,11 @@ * @return a value with the magnitude of {@code magnitude} * and the sign of {@code sign}. * @author Joseph D. Darcy + * @deprecated Use StrictMath.copySign. */ - public static float copySign(float magnitude, float sign) { - return rawCopySign(magnitude, (isNaN(sign)?1.0f:sign)); + @Deprecated + public static float copySign(float magnitude, float sign) { + return StrictMath.copySign(magnitude, sign); } /** @@ -1090,33 +855,11 @@ * @return the size of an ulp of the argument * @author Joseph D. Darcy * @since 1.5 + * @deprecated Use Math.ulp. */ + @Deprecated public static double ulp(double d) { - int exp = getExponent(d); - - switch(exp) { - case DoubleConsts.MAX_EXPONENT+1: // NaN or infinity - return Math.abs(d); - - case DoubleConsts.MIN_EXPONENT-1: // zero or subnormal - return Double.MIN_VALUE; - - default: - assert exp <= DoubleConsts.MAX_EXPONENT && exp >= DoubleConsts.MIN_EXPONENT; - - // ulp(x) is usually 2^(SIGNIFICAND_WIDTH-1)*(2^ilogb(x)) - exp = exp - (DoubleConsts.SIGNIFICAND_WIDTH-1); - if (exp >= DoubleConsts.MIN_EXPONENT) { - return powerOfTwoD(exp); - } - else { - // return a subnormal result; left shift integer - // representation of Double.MIN_VALUE appropriate - // number of positions - return Double.longBitsToDouble(1L << - (exp - (DoubleConsts.MIN_EXPONENT - (DoubleConsts.SIGNIFICAND_WIDTH-1)) )); - } - } + return Math.ulp(d); } /** @@ -1141,33 +884,11 @@ * @return the size of an ulp of the argument * @author Joseph D. Darcy * @since 1.5 + * @deprecated Use Math.ulp. */ + @Deprecated public static float ulp(float f) { - int exp = getExponent(f); - - switch(exp) { - case FloatConsts.MAX_EXPONENT+1: // NaN or infinity - return Math.abs(f); - - case FloatConsts.MIN_EXPONENT-1: // zero or subnormal - return FloatConsts.MIN_VALUE; - - default: - assert exp <= FloatConsts.MAX_EXPONENT && exp >= FloatConsts.MIN_EXPONENT; - - // ulp(x) is usually 2^(SIGNIFICAND_WIDTH-1)*(2^ilogb(x)) - exp = exp - (FloatConsts.SIGNIFICAND_WIDTH-1); - if (exp >= FloatConsts.MIN_EXPONENT) { - return powerOfTwoF(exp); - } - else { - // return a subnormal result; left shift integer - // representation of FloatConsts.MIN_VALUE appropriate - // number of positions - return Float.intBitsToFloat(1 << - (exp - (FloatConsts.MIN_EXPONENT - (FloatConsts.SIGNIFICAND_WIDTH-1)) )); - } - } + return Math.ulp(f); } /** @@ -1186,9 +907,11 @@ * @return the signum function of the argument * @author Joseph D. Darcy * @since 1.5 + * @deprecated Use Math.signum. */ + @Deprecated public static double signum(double d) { - return (d == 0.0 || isNaN(d))?d:copySign(1.0, d); + return Math.signum(d); } /** @@ -1207,9 +930,10 @@ * @return the signum function of the argument * @author Joseph D. Darcy * @since 1.5 + * @deprecated Use Math.signum. */ + @Deprecated public static float signum(float f) { - return (f == 0.0f || isNaN(f))?f:copySign(1.0f, f); + return Math.signum(f); } - }