< prev index next >
src/java.desktop/share/classes/sun/java2d/marlin/FloatMath.java
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -20,33 +20,32 @@
*
* 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;
+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 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) {
@@ -75,22 +74,22 @@
// 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;
+ 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) ? a :
- ( (a < 0f) ? -0f : 1f) );
+ 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,11 +98,11 @@
// 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));
+ & (~(FLOAT_SIGNIF_BIT_MASK >> exponent));
if (intpart == doppel) {
return a; // integral value (including 0)
}
@@ -132,22 +131,22 @@
// 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;
+ 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) ? a :
- ( (a < 0f) ? -1f : 0f) );
+ 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,11 +155,11 @@
// 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));
+ & (~(FLOAT_SIGNIF_BIT_MASK >> exponent));
if (intpart == doppel) {
return a; // integral value (including 0)
}
@@ -189,10 +188,30 @@
}
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,6 +226,26 @@
|| 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 >