9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 22 * CA 95054 USA or visit www.sun.com if you need additional information or 23 * have any questions. 24 */ 25 26 package java.lang; 27 import java.util.Random; 28 import sun.misc.FpUtils; 29 30 /** 31 * The class {@code StrictMath} contains methods for performing basic 32 * numeric operations such as the elementary exponential, logarithm, 33 * square root, and trigonometric functions. 34 * 35 * <p>To help ensure portability of Java programs, the definitions of 36 * some of the numeric functions in this package require that they 37 * produce the same results as certain published algorithms. These 38 * algorithms are available from the well-known network library 39 * {@code netlib} as the package "Freely Distributable Math 40 * Library," <a 41 * href="ftp://ftp.netlib.org/fdlibm.tar">{@code fdlibm}</a>. These 42 * algorithms, which are written in the C programming language, are 43 * then to be understood as executed with all floating-point 44 * operations following the rules of Java floating-point arithmetic. 45 * 46 * <p>The Java math library is defined with respect to 47 * {@code fdlibm} version 5.3. Where {@code fdlibm} provides 48 * more than one definition for a function (such as 299 public static native double IEEEremainder(double f1, double f2); 300 301 /** 302 * Returns the smallest (closest to negative infinity) 303 * {@code double} value that is greater than or equal to the 304 * argument and is equal to a mathematical integer. Special cases: 305 * <ul><li>If the argument value is already equal to a 306 * mathematical integer, then the result is the same as the 307 * argument. <li>If the argument is NaN or an infinity or 308 * positive zero or negative zero, then the result is the same as 309 * the argument. <li>If the argument value is less than zero but 310 * greater than -1.0, then the result is negative zero.</ul> Note 311 * that the value of {@code StrictMath.ceil(x)} is exactly the 312 * value of {@code -StrictMath.floor(-x)}. 313 * 314 * @param a a value. 315 * @return the smallest (closest to negative infinity) 316 * floating-point value that is greater than or equal to 317 * the argument and is equal to a mathematical integer. 318 */ 319 public static native double ceil(double a); 320 321 /** 322 * Returns the largest (closest to positive infinity) 323 * {@code double} value that is less than or equal to the 324 * argument and is equal to a mathematical integer. Special cases: 325 * <ul><li>If the argument value is already equal to a 326 * mathematical integer, then the result is the same as the 327 * argument. <li>If the argument is NaN or an infinity or 328 * positive zero or negative zero, then the result is the same as 329 * the argument.</ul> 330 * 331 * @param a a value. 332 * @return the largest (closest to positive infinity) 333 * floating-point value that less than or equal to the argument 334 * and is equal to a mathematical integer. 335 */ 336 public static native double floor(double a); 337 338 /** 339 * Returns the {@code double} value that is closest in value 340 * to the argument and is equal to a mathematical integer. If two 341 * {@code double} values that are mathematical integers are 342 * equally close to the value of the argument, the result is the 343 * integer value that is even. Special cases: 344 * <ul><li>If the argument value is already equal to a mathematical 345 * integer, then the result is the same as the argument. 346 * <li>If the argument is NaN or an infinity or positive zero or negative 347 * zero, then the result is the same as the argument.</ul> 348 * 349 * @param a a value. 350 * @return the closest floating-point value to {@code a} that is 351 * equal to a mathematical integer. 352 * @author Joseph D. Darcy 353 */ 354 public static double rint(double a) { 355 /* 356 * If the absolute value of a is not less than 2^52, it | ```
9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26 package java.lang;
27 import java.util.Random;
28 import sun.misc.FpUtils;
29 import sun.misc.DoubleConsts;
30
31 /**
32 * The class {@code StrictMath} contains methods for performing basic
33 * numeric operations such as the elementary exponential, logarithm,
34 * square root, and trigonometric functions.
35 *
36 * <p>To help ensure portability of Java programs, the definitions of
37 * some of the numeric functions in this package require that they
38 * produce the same results as certain published algorithms. These
39 * algorithms are available from the well-known network library
40 * {@code netlib} as the package "Freely Distributable Math
41 * Library," <a
42 * href="ftp://ftp.netlib.org/fdlibm.tar">{@code fdlibm}</a>. These
43 * algorithms, which are written in the C programming language, are
44 * then to be understood as executed with all floating-point
45 * operations following the rules of Java floating-point arithmetic.
46 *
47 * <p>The Java math library is defined with respect to
48 * {@code fdlibm} version 5.3. Where {@code fdlibm} provides
49 * more than one definition for a function (such as
``` 300 public static native double IEEEremainder(double f1, double f2); 301 302 /** 303 * Returns the smallest (closest to negative infinity) 304 * {@code double} value that is greater than or equal to the 305 * argument and is equal to a mathematical integer. Special cases: 306 * <ul><li>If the argument value is already equal to a 307 * mathematical integer, then the result is the same as the 308 * argument. <li>If the argument is NaN or an infinity or 309 * positive zero or negative zero, then the result is the same as 310 * the argument. <li>If the argument value is less than zero but 311 * greater than -1.0, then the result is negative zero.</ul> Note 312 * that the value of {@code StrictMath.ceil(x)} is exactly the 313 * value of {@code -StrictMath.floor(-x)}. 314 * 315 * @param a a value. 316 * @return the smallest (closest to negative infinity) 317 * floating-point value that is greater than or equal to 318 * the argument and is equal to a mathematical integer. 319 */ 320 public static double ceil(double a) { 321 return floorOrCeil(a, -0.0, 1.0, 1.0); 322 } 323 324 /** 325 * Returns the largest (closest to positive infinity) 326 * {@code double} value that is less than or equal to the 327 * argument and is equal to a mathematical integer. Special cases: 328 * <ul><li>If the argument value is already equal to a 329 * mathematical integer, then the result is the same as the 330 * argument. <li>If the argument is NaN or an infinity or 331 * positive zero or negative zero, then the result is the same as 332 * the argument.</ul> 333 * 334 * @param a a value. 335 * @return the largest (closest to positive infinity) 336 * floating-point value that less than or equal to the argument 337 * and is equal to a mathematical integer. 338 */ 339 public static double floor(double a) { 340 return floorOrCeil(a, -1.0, 0.0, -1.0); 341 } 342 343 /** 344 * Internal method to share logic between floor and ceil. 345 * 346 * @param a the value to be floored or ceiled 347 * @param negativeBoundary result for values in (-1, 0) 348 * @param positiveBoundary result for values in (0, 1) 349 * @param increment value to add when the argument is non-integral 350 */ 351 private static double floorOrCeil(double a, 352 double negativeBoundary, 353 double positiveBoundary, 354 double sign) { 355 int exponent = Math.getExponent(a); 356 357 if (exponent < 0) { 358 /* 359 * Absolute value of argument is less than 1. 360 * floorOrceil(-0.0) => -0.0 361 * floorOrceil(+0.0) => +0.0 362 */ 363 return ((a == 0.0) ? a : 364 ( (a < 0.0) ? negativeBoundary : positiveBoundary) ); 365 } else if (exponent >= 52) { 366 /* 367 * Infinity, NaN, or a value so large it must be integral. 368 */ 369 return a; 370 } 371 // Else the argument is either an integral value already XOR it 372 // has to be rounded to one. 373 assert exponent >= 0 && exponent <= 51; 374 375 long doppel = Double.doubleToRawLongBits(a); 376 long mask = DoubleConsts.SIGNIF_BIT_MASK >> exponent; 377 378 if ( (mask & doppel) == 0L ) 379 return a; // integral value 380 else { 381 double result = Double.longBitsToDouble(doppel & (~mask)); 382 if (sign*a > 0.0) 383 result = result + sign; 384 return result; 385 } 386 } 387 388 /** 389 * Returns the {@code double} value that is closest in value 390 * to the argument and is equal to a mathematical integer. If two 391 * {@code double} values that are mathematical integers are 392 * equally close to the value of the argument, the result is the 393 * integer value that is even. Special cases: 394 * <ul><li>If the argument value is already equal to a mathematical 395 * integer, then the result is the same as the argument. 396 * <li>If the argument is NaN or an infinity or positive zero or negative 397 * zero, then the result is the same as the argument.</ul> 398 * 399 * @param a a value. 400 * @return the closest floating-point value to {@code a} that is 401 * equal to a mathematical integer. 402 * @author Joseph D. Darcy 403 */ 404 public static double rint(double a) { 405 /* 406 * If the absolute value of a is not less than 2^52, it |