< 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 >