1 /*
2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package sun.java2d.marlin;
26
27 import jdk.internal.math.DoubleConsts;
28 import jdk.internal.math.FloatConsts;
29
30 /**
31 * Faster Math ceil / floor routines derived from StrictMath
32 */
33 public final class FloatMath implements MarlinConst {
34
35 // overflow / NaN handling enabled:
36 static final boolean CHECK_OVERFLOW = true;
37 static final boolean CHECK_NAN = true;
38
39 private FloatMath() {
40 // utility class
41 }
42
43 // faster inlined min/max functions in the branch prediction is high
44 static float max(final float a, final float b) {
45 // no NaN handling
46 return (a >= b) ? a : b;
47 }
192 }
193
194 /**
195 * Faster alternative to floor(float) optimized for the integer domain
196 * and supporting NaN and +/-Infinity.
197 *
198 * @param a a value.
199 * @return the largest (closest to positive infinity) floating-point value
200 * that less than or equal to the argument and is equal to a mathematical
201 * integer.
202 */
203 public static int floor_int(final float a) {
204 final int intpart = (int) a;
205
206 if (a >= intpart
207 || (CHECK_OVERFLOW && intpart == Integer.MIN_VALUE)
208 || CHECK_NAN && Float.isNaN(a)) {
209 return intpart;
210 }
211 return intpart - 1;
212 }
213
214 /**
215 * Returns a floating-point power of two in the normal range.
216 */
217 static double powerOfTwoD(int n) {
218 assert (n >= DoubleConsts.MIN_EXPONENT && n <= DoubleConsts.MAX_EXPONENT);
219 return Double.longBitsToDouble((((long) n + (long) DoubleConsts.EXP_BIAS)
220 << (DoubleConsts.SIGNIFICAND_WIDTH - 1))
221 & DoubleConsts.EXP_BIT_MASK);
222 }
223 }
|
1 /*
2 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package sun.java2d.marlin;
26
27 import jdk.internal.math.FloatConsts;
28
29 /**
30 * Faster Math ceil / floor routines derived from StrictMath
31 */
32 public final class FloatMath implements MarlinConst {
33
34 // overflow / NaN handling enabled:
35 static final boolean CHECK_OVERFLOW = true;
36 static final boolean CHECK_NAN = true;
37
38 private FloatMath() {
39 // utility class
40 }
41
42 // faster inlined min/max functions in the branch prediction is high
43 static float max(final float a, final float b) {
44 // no NaN handling
45 return (a >= b) ? a : b;
46 }
191 }
192
193 /**
194 * Faster alternative to floor(float) optimized for the integer domain
195 * and supporting NaN and +/-Infinity.
196 *
197 * @param a a value.
198 * @return the largest (closest to positive infinity) floating-point value
199 * that less than or equal to the argument and is equal to a mathematical
200 * integer.
201 */
202 public static int floor_int(final float a) {
203 final int intpart = (int) a;
204
205 if (a >= intpart
206 || (CHECK_OVERFLOW && intpart == Integer.MIN_VALUE)
207 || CHECK_NAN && Float.isNaN(a)) {
208 return intpart;
209 }
210 return intpart - 1;
211 }
212 }
|