< prev index next >

src/java.desktop/share/classes/sun/java2d/marlin/FloatMath.java

Print this page

        

*** 20,52 **** * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ - package sun.java2d.marlin; ! import jdk.internal.math.FloatConsts; /** * Faster Math ceil / floor routines derived from StrictMath */ public final class FloatMath implements MarlinConst { // overflow / NaN handling enabled: static final boolean CHECK_OVERFLOW = true; static final boolean CHECK_NAN = true; private FloatMath() { // utility class } // faster inlined min/max functions in the branch prediction is high - static float max(final float a, final float b) { - // no NaN handling - return (a >= b) ? a : b; - } - static int max(final int a, final int b) { return (a >= b) ? a : b; } static int min(final int a, final int b) { --- 20,51 ---- * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ ! package sun.java2d.marlin; /** * Faster Math ceil / floor routines derived from StrictMath */ public final class FloatMath implements MarlinConst { // overflow / NaN handling enabled: static final boolean CHECK_OVERFLOW = true; static final boolean CHECK_NAN = true; + // Copied from sun.misc.FloatConsts: + public static final int FLOAT_SIGNIFICAND_WIDTH = 24; // sun.misc.FloatConsts.SIGNIFICAND_WIDTH + public static final int FLOAT_EXP_BIAS = 127; // sun.misc.FloatConsts.EXP_BIAS + public static final int FLOAT_EXP_BIT_MASK = 2139095040;// sun.misc.FloatConsts.EXP_BIT_MASK + public static final int FLOAT_SIGNIF_BIT_MASK = 8388607;// sun.misc.FloatConsts.SIGNIF_BIT_MASK private FloatMath() { // utility class } // faster inlined min/max functions in the branch prediction is high static int max(final int a, final int b) { return (a >= b) ? a : b; } static int min(final int a, final int b) {
*** 75,96 **** // Inline call to Math.getExponent(a) to // compute only once Float.floatToRawIntBits(a) final int doppel = Float.floatToRawIntBits(a); ! final int exponent = ((doppel & FloatConsts.EXP_BIT_MASK) ! >> (FloatConsts.SIGNIFICAND_WIDTH - 1)) ! - FloatConsts.EXP_BIAS; if (exponent < 0) { /* * Absolute value of argument is less than 1. * floorOrceil(-0.0) => -0.0 * floorOrceil(+0.0) => +0.0 */ ! return ((a == 0) ? a : ! ( (a < 0f) ? -0f : 1f) ); } if (CHECK_OVERFLOW && (exponent >= 23)) { // 52 for double /* * Infinity, NaN, or a value so large it must be integral. */ --- 74,95 ---- // Inline call to Math.getExponent(a) to // compute only once Float.floatToRawIntBits(a) final int doppel = Float.floatToRawIntBits(a); ! final int exponent = ((doppel & FLOAT_EXP_BIT_MASK) ! >> (FLOAT_SIGNIFICAND_WIDTH - 1)) ! - FLOAT_EXP_BIAS; if (exponent < 0) { /* * Absolute value of argument is less than 1. * floorOrceil(-0.0) => -0.0 * floorOrceil(+0.0) => +0.0 */ ! return ((a == 0.0f) ? a : ! ( (a < 0.0f) ? -0.0f : 1.0f) ); } if (CHECK_OVERFLOW && (exponent >= 23)) { // 52 for double /* * Infinity, NaN, or a value so large it must be integral. */
*** 99,109 **** // Else the argument is either an integral value already XOR it // has to be rounded to one. assert exponent >= 0 && exponent <= 22; // 51 for double final int intpart = doppel ! & (~(FloatConsts.SIGNIF_BIT_MASK >> exponent)); if (intpart == doppel) { return a; // integral value (including 0) } --- 98,108 ---- // Else the argument is either an integral value already XOR it // has to be rounded to one. assert exponent >= 0 && exponent <= 22; // 51 for double final int intpart = doppel ! & (~(FLOAT_SIGNIF_BIT_MASK >> exponent)); if (intpart == doppel) { return a; // integral value (including 0) }
*** 132,153 **** // Inline call to Math.getExponent(a) to // compute only once Float.floatToRawIntBits(a) final int doppel = Float.floatToRawIntBits(a); ! final int exponent = ((doppel & FloatConsts.EXP_BIT_MASK) ! >> (FloatConsts.SIGNIFICAND_WIDTH - 1)) ! - FloatConsts.EXP_BIAS; if (exponent < 0) { /* * Absolute value of argument is less than 1. * floorOrceil(-0.0) => -0.0 * floorOrceil(+0.0) => +0.0 */ ! return ((a == 0) ? a : ! ( (a < 0f) ? -1f : 0f) ); } if (CHECK_OVERFLOW && (exponent >= 23)) { // 52 for double /* * Infinity, NaN, or a value so large it must be integral. */ --- 131,152 ---- // Inline call to Math.getExponent(a) to // compute only once Float.floatToRawIntBits(a) final int doppel = Float.floatToRawIntBits(a); ! final int exponent = ((doppel & FLOAT_EXP_BIT_MASK) ! >> (FLOAT_SIGNIFICAND_WIDTH - 1)) ! - FLOAT_EXP_BIAS; if (exponent < 0) { /* * Absolute value of argument is less than 1. * floorOrceil(-0.0) => -0.0 * floorOrceil(+0.0) => +0.0 */ ! return ((a == 0.0f) ? a : ! ( (a < 0.0f) ? -1.0f : 0.0f) ); } if (CHECK_OVERFLOW && (exponent >= 23)) { // 52 for double /* * Infinity, NaN, or a value so large it must be integral. */
*** 156,166 **** // Else the argument is either an integral value already XOR it // has to be rounded to one. assert exponent >= 0 && exponent <= 22; // 51 for double final int intpart = doppel ! & (~(FloatConsts.SIGNIF_BIT_MASK >> exponent)); if (intpart == doppel) { return a; // integral value (including 0) } --- 155,165 ---- // Else the argument is either an integral value already XOR it // has to be rounded to one. assert exponent >= 0 && exponent <= 22; // 51 for double final int intpart = doppel ! & (~(FLOAT_SIGNIF_BIT_MASK >> exponent)); if (intpart == doppel) { return a; // integral value (including 0) }
*** 189,198 **** --- 188,217 ---- } return intpart + 1; } /** + * Faster alternative to ceil(double) optimized for the integer domain + * and supporting NaN and +/-Infinity. + * + * @param a a value. + * @return the largest (closest to positive infinity) integer value + * that less than or equal to the argument and is equal to a mathematical + * integer. + */ + public static int ceil_int(final double a) { + final int intpart = (int) a; + + if (a <= intpart + || (CHECK_OVERFLOW && intpart == Integer.MAX_VALUE) + || CHECK_NAN && Double.isNaN(a)) { + return intpart; + } + return intpart + 1; + } + + /** * Faster alternative to floor(float) optimized for the integer domain * and supporting NaN and +/-Infinity. * * @param a a value. * @return the largest (closest to positive infinity) floating-point value
*** 207,212 **** --- 226,251 ---- || CHECK_NAN && Float.isNaN(a)) { return intpart; } return intpart - 1; } + + /** + * Faster alternative to floor(double) optimized for the integer domain + * and supporting NaN and +/-Infinity. + * + * @param a a value. + * @return the largest (closest to positive infinity) floating-point value + * that less than or equal to the argument and is equal to a mathematical + * integer. + */ + public static int floor_int(final double a) { + final int intpart = (int) a; + + if (a >= intpart + || (CHECK_OVERFLOW && intpart == Integer.MIN_VALUE) + || CHECK_NAN && Double.isNaN(a)) { + return intpart; + } + return intpart - 1; + } }
< prev index next >