src/share/classes/java/lang/Math.java

Print this page


   1 /*
   2  * Copyright (c) 1994, 2010, 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


 610      * <p>(In the foregoing descriptions, a floating-point value is
 611      * considered to be an integer if and only if it is finite and a
 612      * fixed point of the method {@link #ceil ceil} or,
 613      * equivalently, a fixed point of the method {@link #floor
 614      * floor}. A value is a fixed point of a one-argument
 615      * method if and only if the result of applying the method to the
 616      * value is equal to the value.)
 617      *
 618      * <p>The computed result must be within 1 ulp of the exact result.
 619      * Results must be semi-monotonic.
 620      *
 621      * @param   a   the base.
 622      * @param   b   the exponent.
 623      * @return  the value {@code a}<sup>{@code b}</sup>.
 624      */
 625     public static double pow(double a, double b) {
 626         return StrictMath.pow(a, b); // default impl. delegates to StrictMath
 627     }
 628 
 629     /**
 630      * Returns the closest {@code int} to the argument. The
 631      * result is rounded to an integer by adding 1/2, taking the
 632      * floor of the result, and casting the result to type {@code int}.
 633      * In other words, the result is equal to the value of the expression:
 634      * <p>{@code (int)Math.floor(a + 0.5f)}
 635      * <p>
 636      * Special cases:
 637      * <ul><li>If the argument is NaN, the result is 0.
 638      * <li>If the argument is negative infinity or any value less than or
 639      * equal to the value of {@code Integer.MIN_VALUE}, the result is
 640      * equal to the value of {@code Integer.MIN_VALUE}.
 641      * <li>If the argument is positive infinity or any value greater than or
 642      * equal to the value of {@code Integer.MAX_VALUE}, the result is
 643      * equal to the value of {@code Integer.MAX_VALUE}.</ul>
 644      *
 645      * @param   a   a floating-point value to be rounded to an integer.
 646      * @return  the value of the argument rounded to the nearest
 647      *          {@code int} value.
 648      * @see     java.lang.Integer#MAX_VALUE
 649      * @see     java.lang.Integer#MIN_VALUE
 650      */
 651     public static int round(float a) {

 652         return (int)floor(a + 0.5f);


 653     }
 654 
 655     /**
 656      * Returns the closest {@code long} to the argument. The result
 657      * is rounded to an integer by adding 1/2, taking the floor of the
 658      * result, and casting the result to type {@code long}. In other
 659      * words, the result is equal to the value of the expression:
 660      * <p>{@code (long)Math.floor(a + 0.5d)}
 661      * <p>
 662      * Special cases:
 663      * <ul><li>If the argument is NaN, the result is 0.
 664      * <li>If the argument is negative infinity or any value less than or
 665      * equal to the value of {@code Long.MIN_VALUE}, the result is
 666      * equal to the value of {@code Long.MIN_VALUE}.
 667      * <li>If the argument is positive infinity or any value greater than or
 668      * equal to the value of {@code Long.MAX_VALUE}, the result is
 669      * equal to the value of {@code Long.MAX_VALUE}.</ul>
 670      *
 671      * @param   a   a floating-point value to be rounded to a
 672      *          {@code long}.
 673      * @return  the value of the argument rounded to the nearest
 674      *          {@code long} value.
 675      * @see     java.lang.Long#MAX_VALUE
 676      * @see     java.lang.Long#MIN_VALUE
 677      */
 678     public static long round(double a) {

 679         return (long)floor(a + 0.5d);


 680     }
 681 
 682     private static Random randomNumberGenerator;
 683 
 684     private static synchronized Random initRNG() {
 685         Random rnd = randomNumberGenerator;
 686         return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd;
 687     }
 688 
 689     /**
 690      * Returns a {@code double} value with a positive sign, greater
 691      * than or equal to {@code 0.0} and less than {@code 1.0}.
 692      * Returned values are chosen pseudorandomly with (approximately)
 693      * uniform distribution from that range.
 694      *
 695      * <p>When this method is first called, it creates a single new
 696      * pseudorandom-number generator, exactly as if by the expression
 697      *
 698      * <blockquote>{@code new java.util.Random()}</blockquote>
 699      *


   1 /*
   2  * Copyright (c) 1994, 2011, 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


 610      * <p>(In the foregoing descriptions, a floating-point value is
 611      * considered to be an integer if and only if it is finite and a
 612      * fixed point of the method {@link #ceil ceil} or,
 613      * equivalently, a fixed point of the method {@link #floor
 614      * floor}. A value is a fixed point of a one-argument
 615      * method if and only if the result of applying the method to the
 616      * value is equal to the value.)
 617      *
 618      * <p>The computed result must be within 1 ulp of the exact result.
 619      * Results must be semi-monotonic.
 620      *
 621      * @param   a   the base.
 622      * @param   b   the exponent.
 623      * @return  the value {@code a}<sup>{@code b}</sup>.
 624      */
 625     public static double pow(double a, double b) {
 626         return StrictMath.pow(a, b); // default impl. delegates to StrictMath
 627     }
 628 
 629     /**
 630      * Returns the closest {@code int} to the argument, with ties
 631      * rounding up.
 632      *


 633      * <p>
 634      * Special cases:
 635      * <ul><li>If the argument is NaN, the result is 0.
 636      * <li>If the argument is negative infinity or any value less than or
 637      * equal to the value of {@code Integer.MIN_VALUE}, the result is
 638      * equal to the value of {@code Integer.MIN_VALUE}.
 639      * <li>If the argument is positive infinity or any value greater than or
 640      * equal to the value of {@code Integer.MAX_VALUE}, the result is
 641      * equal to the value of {@code Integer.MAX_VALUE}.</ul>
 642      *
 643      * @param   a   a floating-point value to be rounded to an integer.
 644      * @return  the value of the argument rounded to the nearest
 645      *          {@code int} value.
 646      * @see     java.lang.Integer#MAX_VALUE
 647      * @see     java.lang.Integer#MIN_VALUE
 648      */
 649     public static int round(float a) {
 650         if (a != 0x1.fffffep-2f) // greatest float value less than 0.5
 651             return (int)floor(a + 0.5f);
 652         else
 653             return 0;
 654     }
 655 
 656     /**
 657      * Returns the closest {@code long} to the argument, with ties
 658      * rounding up.
 659      *
 660      * <p>Special cases:



 661      * <ul><li>If the argument is NaN, the result is 0.
 662      * <li>If the argument is negative infinity or any value less than or
 663      * equal to the value of {@code Long.MIN_VALUE}, the result is
 664      * equal to the value of {@code Long.MIN_VALUE}.
 665      * <li>If the argument is positive infinity or any value greater than or
 666      * equal to the value of {@code Long.MAX_VALUE}, the result is
 667      * equal to the value of {@code Long.MAX_VALUE}.</ul>
 668      *
 669      * @param   a   a floating-point value to be rounded to a
 670      *          {@code long}.
 671      * @return  the value of the argument rounded to the nearest
 672      *          {@code long} value.
 673      * @see     java.lang.Long#MAX_VALUE
 674      * @see     java.lang.Long#MIN_VALUE
 675      */
 676     public static long round(double a) {
 677         if (a != 0x1.fffffffffffffp-2) // greatest double value less than 0.5
 678             return (long)floor(a + 0.5d);
 679         else
 680             return 0;
 681     }
 682 
 683     private static Random randomNumberGenerator;
 684 
 685     private static synchronized Random initRNG() {
 686         Random rnd = randomNumberGenerator;
 687         return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd;
 688     }
 689 
 690     /**
 691      * Returns a {@code double} value with a positive sign, greater
 692      * than or equal to {@code 0.0} and less than {@code 1.0}.
 693      * Returned values are chosen pseudorandomly with (approximately)
 694      * uniform distribution from that range.
 695      *
 696      * <p>When this method is first called, it creates a single new
 697      * pseudorandom-number generator, exactly as if by the expression
 698      *
 699      * <blockquote>{@code new java.util.Random()}</blockquote>
 700      *