www.pudn.com > j2me_cldc-1_1-fcs-src-winunix.rar > Math.java


/*
 * Copyright © 2003 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 */

package java.lang;

/**
 * The class Math contains methods for performing basic
 * numeric operations.
 *
 * @author  unascribed
 * @version 12/17/01 (CLDC 1.1)
 * @since   JDK1.0, CLDC 1.0
 */

public final strictfp class Math {

    /**
     * Don't let anyone instantiate this class.
     */
    private Math() {}

    /**
     * The double value that is closer than any other to
     * e, the base of the natural logarithms.
     * @since CLDC 1.1
     */
    public static final double E = 2.7182818284590452354;

    /**
     * The double value that is closer than any other to
     * pi, the ratio of the circumference of a circle to its diameter.
     * @since CLDC 1.1
     */
    public static final double PI = 3.14159265358979323846;

    /**
     * Returns the trigonometric sine of an angle.  Special cases:
     * 
     *
     * @param   a   an angle, in radians.
     * @return  the sine of the argument.
     * @since   CLDC 1.1
     */
    public static native double sin(double a); 

    /**
     * Returns the trigonometric cosine of an angle. Special case:
     * 
     *
     * @param   a   an angle, in radians.
     * @return  the cosine of the argument.
     * @since   CLDC 1.1
     */
    public static native double cos(double a); 

    /**
     * Returns the trigonometric tangent of an angle.  Special cases:
     * 
     *
     * @param   a   an angle, in radians.
     * @return  the tangent of the argument.
     * @since   CLDC 1.1
     */
    public static native double tan(double a);

    /**
     * Converts an angle measured in degrees to the equivalent angle
     * measured in radians.
     *
     * @param   angdeg   an angle, in degrees
     * @return  the measurement of the angle angdeg
     *          in radians.
     * @since   CLDC 1.1
     */
    public static double toRadians(double angdeg) {
        return angdeg / 180.0 * PI;
    }

    /**
     * Converts an angle measured in radians to the equivalent angle
     * measured in degrees.
     *
     * @param   angrad   an angle, in radians
     * @return  the measurement of the angle angrad
     *          in degrees.
     * @since   CLDC 1.1
     */
    public static double toDegrees(double angrad) {
        return angrad * 180.0 / PI;
    }

    /**
     * Returns the correctly rounded positive square root of a 
     * double value.
     * Special cases:
     * 
     * 
     * @param   a   a double value.
     * @return  the positive square root of a.
     *          If the argument is NaN or less than zero, the result is NaN.
     * @since   CLDC 1.1
     */
    public static native double sqrt(double a);

    /**
     * Returns the smallest (closest to negative infinity)
     * double value that is not less than the argument and is
     * equal to a mathematical integer. Special cases:
     * 
     * Note that the value of Math.ceil(x) is exactly the
     * value of -Math.floor(-x).
     *
     * @param   a   a double value.
     * 
     * @return  the smallest (closest to negative infinity) 
     *          double value that is not less than the argument
     *          and is equal to a mathematical integer.
     * @since   CLDC 1.1
     */
    public static native double ceil(double a);

    /**
     * Returns the largest (closest to positive infinity)
     * double value that is not greater than the argument and
     * is equal to a mathematical integer. Special cases:
     * 
     *
     * @param   a   a double value.
     * 
     * @return  the largest (closest to positive infinity)
     *          double value that is not greater than the argument
     *          and is equal to a mathematical integer.
     * @since   CLDC 1.1
     */
    public static native double floor(double a);

    /**
     * Returns the absolute value of an int value.
     * If the argument is not negative, the argument is returned.
     * If the argument is negative, the negation of the argument is returned.
     * 

* Note that if the argument is equal to the value of * Integer.MIN_VALUE, the most negative representable * int value, the result is that same value, which is * negative. * * @param a an int value. * @return the absolute value of the argument. * @see java.lang.Integer#MIN_VALUE */ public static int abs(int a) { return (a < 0) ? -a : a; } /** * Returns the absolute value of a long value. * If the argument is not negative, the argument is returned. * If the argument is negative, the negation of the argument is returned. *

* Note that if the argument is equal to the value of * Long.MIN_VALUE, the most negative representable * long value, the result is that same value, which is * negative. * * @param a a long value. * @return the absolute value of the argument. * @see java.lang.Long#MIN_VALUE */ public static long abs(long a) { return (a < 0) ? -a : a; } /** * Returns the absolute value of a float value. * If the argument is not negative, the argument is returned. * If the argument is negative, the negation of the argument is returned. * Special cases: *

* In other words, the result is equal to the value of the expression: *

Float.intBitsToFloat(0x7fffffff & Float.floatToIntBits(a))
* * @param a a float value. * @return the absolute value of the argument. * @since CLDC 1.1 */ public static float abs(float a) { return (a <= 0.0F) ? 0.0F - a : a; } /** * Returns the absolute value of a double value. * If the argument is not negative, the argument is returned. * If the argument is negative, the negation of the argument is returned. * Special cases: * * In other words, the result is equal to the value of the expression: *

Double.longBitsToDouble((Double.doubleToLongBits(a)<<1)>>>1)
* * @param a a double value. * @return the absolute value of the argument. * @since CLDC 1.1 */ public static double abs(double a) { return (a <= 0.0D) ? 0.0D - a : a; } /** * Returns the greater of two int values. That is, the * result is the argument closer to the value of * Integer.MAX_VALUE. If the arguments have the same value, * the result is that same value. * * @param a an int value. * @param b an int value. * @return the larger of a and b. * @see java.lang.Long#MAX_VALUE */ public static int max(int a, int b) { return (a >= b) ? a : b; } /** * Returns the greater of two long values. That is, the * result is the argument closer to the value of * Long.MAX_VALUE. If the arguments have the same value, * the result is that same value. * * @param a a long value. * @param b a long value. * @return the larger of a and b. * @see java.lang.Long#MAX_VALUE */ public static long max(long a, long b) { return (a >= b) ? a : b; } private static long negativeZeroFloatBits = Float.floatToIntBits(-0.0f); private static long negativeZeroDoubleBits = Double.doubleToLongBits(-0.0d); /** * Returns the greater of two float values. That is, the * result is the argument closer to positive infinity. If the * arguments have the same value, the result is that same value. If * either value is NaN, then the result is NaN. * Unlike the the numerical comparison operators, this method considers * negative zero to be strictly smaller than positive zero. If one * argument is positive zero and the other negative zero, the result * is positive zero. * * @param a a float value. * @param b a float value. * @return the larger of a and b. */ public static float max(float a, float b) { if (a != a) return a; // a is NaN if ((a == 0.0f) && (b == 0.0f) && (Float.floatToIntBits(a) == negativeZeroFloatBits)) { return b; } return (a >= b) ? a : b; } /** * Returns the greater of two double values. That is, the * result is the argument closer to positive infinity. If the * arguments have the same value, the result is that same value. If * either value is NaN, then the result is NaN. * Unlike the the numerical comparison operators, this method considers * negative zero to be strictly smaller than positive zero. If one * argument is positive zero and the other negative zero, the result * is positive zero. * * @param a a double value. * @param b a double value. * @return the larger of a and b. */ public static double max(double a, double b) { if (a != a) return a; // a is NaN if ((a == 0.0d) && (b == 0.0d) && (Double.doubleToLongBits(a) == negativeZeroDoubleBits)) { return b; } return (a >= b) ? a : b; } /** * Returns the smaller of two int values. That is, the * result the argument closer to the value of Integer.MIN_VALUE. * If the arguments have the same value, the result is that same value. * * @param a an int value. * @param b an int value. * @return the smaller of a and b. * @see java.lang.Long#MIN_VALUE */ public static int min(int a, int b) { return (a <= b) ? a : b; } /** * Returns the smaller of two long values. That is, the * result is the argument closer to the value of * Long.MIN_VALUE. If the arguments have the same value, * the result is that same value. * * @param a a long value. * @param b a long value. * @return the smaller of a and b. * @see java.lang.Long#MIN_VALUE */ public static long min(long a, long b) { return (a <= b) ? a : b; } /** * Returns the smaller of two float values. That is, the * result is the value closer to negative infinity. If the arguments * have the same value, the result is that same value. If either value * is NaN, then the result is NaN. Unlike the * the numerical comparison operators, this method considers negative zero * to be strictly smaller than positive zero. If one argument is * positive zero and the other is negative zero, the result is negative * zero. * * @param a a float value. * @param b a float value. * @return the smaller of a and b. * @since CLDC 1.1 */ public static float min(float a, float b) { if (a != a) return a; // a is NaN if ((a == 0.0f) && (b == 0.0f) && (Float.floatToIntBits(b) == negativeZeroFloatBits)) { return b; } return (a <= b) ? a : b; } /** * Returns the smaller of two double values. That is, the * result is the value closer to negative infinity. If the arguments have * the same value, the result is that same value. If either value * is NaN, then the result is NaN. Unlike the * the numerical comparison operators, this method considers negative zero * to be strictly smaller than positive zero. If one argument is * positive zero and the other is negative zero, the result is negative * zero. * * @param a a double value. * @param b a double value. * @return the smaller of a and b. * @since CLDC 1.1 */ public static double min(double a, double b) { if (a != a) return a; // a is NaN if ((a == 0.0d) && (b == 0.0d) && (Double.doubleToLongBits(b) == negativeZeroDoubleBits)) { return b; } return (a <= b) ? a : b; } }