Source Code Cross Referenced for Math.java in  » JDK-Core » lang » java » lang » Java Source Code / Java DocumentationJava Source Code and Java Documentation

Java Source Code / Java Documentation
1. JDK Core
2. JDK Modules
3. JDK Modules com.sun
4. JDK Modules com.sun.java
5. JDK Modules Platform
6. JDK Modules sun
7. Open Source Build
8. Open Source Graphic Library
9. Open Source IDE Eclipse
10. Open Source J2EE
11. Open Source JDBC Driver
12. Open Source Library
13. Open Source Library Database
14. Open Source Net
15. Open Source Script
16. Science
17. Security
18. Sevlet Container
19. SUN GlassFish
20. Swing Library
21. Web Services apache cxf 2.0.1
22. Web Services AXIS2
23. XML
Microsoft Office Word 2007 Tutorial
Java
Java Tutorial
Java Open Source
Jar File Download
Java Articles
Java Products
Java by API
C# / C Sharp
C# / CSharp Tutorial
ASP.Net
JavaScript DHTML
JavaScript Tutorial
JavaScript Reference
HTML / CSS
HTML CSS Reference
C / ANSI-C
C Tutorial
C++
C++ Tutorial
PHP
Python
SQL Server / T-SQL
Oracle PL / SQL
Oracle PL/SQL Tutorial
PostgreSQL
SQL / MySQL
MySQL Tutorial
VB.Net
VB.Net Tutorial
Java Source Code / Java Documentation » JDK Core » lang » java.lang 
Source Cross Referenced  Class Diagram Java Document (Java Doc) 


0001:        /*
0002:         * Copyright 1994-2006 Sun Microsystems, Inc.  All Rights Reserved.
0003:         * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0004:         *
0005:         * This code is free software; you can redistribute it and/or modify it
0006:         * under the terms of the GNU General Public License version 2 only, as
0007:         * published by the Free Software Foundation.  Sun designates this
0008:         * particular file as subject to the "Classpath" exception as provided
0009:         * by Sun in the LICENSE file that accompanied this code.
0010:         *
0011:         * This code is distributed in the hope that it will be useful, but WITHOUT
0012:         * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0013:         * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
0014:         * version 2 for more details (a copy is included in the LICENSE file that
0015:         * accompanied this code).
0016:         *
0017:         * You should have received a copy of the GNU General Public License version
0018:         * 2 along with this work; if not, write to the Free Software Foundation,
0019:         * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0020:         *
0021:         * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
0022:         * CA 95054 USA or visit www.sun.com if you need additional information or
0023:         * have any questions.
0024:         */
0025:
0026:        package java.lang;
0027:
0028:        import java.util.Random;
0029:
0030:        /**
0031:         * The class {@code Math} contains methods for performing basic
0032:         * numeric operations such as the elementary exponential, logarithm,
0033:         * square root, and trigonometric functions.
0034:         * 
0035:         * <p>Unlike some of the numeric methods of class
0036:         * {@code StrictMath}, all implementations of the equivalent
0037:         * functions of class {@code Math} are not defined to return the
0038:         * bit-for-bit same results.  This relaxation permits
0039:         * better-performing implementations where strict reproducibility is
0040:         * not required.
0041:         * 
0042:         * <p>By default many of the {@code Math} methods simply call
0043:         * the equivalent method in {@code StrictMath} for their
0044:         * implementation.  Code generators are encouraged to use
0045:         * platform-specific native libraries or microprocessor instructions,
0046:         * where available, to provide higher-performance implementations of
0047:         * {@code Math} methods.  Such higher-performance
0048:         * implementations still must conform to the specification for
0049:         * {@code Math}.
0050:         * 
0051:         * <p>The quality of implementation specifications concern two
0052:         * properties, accuracy of the returned result and monotonicity of the
0053:         * method.  Accuracy of the floating-point {@code Math} methods
0054:         * is measured in terms of <i>ulps</i>, units in the last place.  For
0055:         * a given floating-point format, an ulp of a specific real number
0056:         * value is the distance between the two floating-point values
0057:         * bracketing that numerical value.  When discussing the accuracy of a
0058:         * method as a whole rather than at a specific argument, the number of
0059:         * ulps cited is for the worst-case error at any argument.  If a
0060:         * method always has an error less than 0.5 ulps, the method always
0061:         * returns the floating-point number nearest the exact result; such a
0062:         * method is <i>correctly rounded</i>.  A correctly rounded method is
0063:         * generally the best a floating-point approximation can be; however,
0064:         * it is impractical for many floating-point methods to be correctly
0065:         * rounded.  Instead, for the {@code Math} class, a larger error
0066:         * bound of 1 or 2 ulps is allowed for certain methods.  Informally,
0067:         * with a 1 ulp error bound, when the exact result is a representable
0068:         * number, the exact result should be returned as the computed result;
0069:         * otherwise, either of the two floating-point values which bracket
0070:         * the exact result may be returned.  For exact results large in
0071:         * magnitude, one of the endpoints of the bracket may be infinite.
0072:         * Besides accuracy at individual arguments, maintaining proper
0073:         * relations between the method at different arguments is also
0074:         * important.  Therefore, most methods with more than 0.5 ulp errors
0075:         * are required to be <i>semi-monotonic</i>: whenever the mathematical
0076:         * function is non-decreasing, so is the floating-point approximation,
0077:         * likewise, whenever the mathematical function is non-increasing, so
0078:         * is the floating-point approximation.  Not all approximations that
0079:         * have 1 ulp accuracy will automatically meet the monotonicity
0080:         * requirements.
0081:         * 
0082:         * @author  unascribed
0083:         * @author  Joseph D. Darcy
0084:         * @version 1.80, 06/20/07
0085:         * @since   JDK1.0
0086:         */
0087:
0088:        public final class Math {
0089:
0090:            /**
0091:             * Don't let anyone instantiate this class.
0092:             */
0093:            private Math() {
0094:            }
0095:
0096:            /**
0097:             * The {@code double} value that is closer than any other to
0098:             * <i>e</i>, the base of the natural logarithms.
0099:             */
0100:            public static final double E = 2.7182818284590452354;
0101:
0102:            /**
0103:             * The {@code double} value that is closer than any other to
0104:             * <i>pi</i>, the ratio of the circumference of a circle to its
0105:             * diameter.
0106:             */
0107:            public static final double PI = 3.14159265358979323846;
0108:
0109:            /**
0110:             * Returns the trigonometric sine of an angle.  Special cases:
0111:             * <ul><li>If the argument is NaN or an infinity, then the 
0112:             * result is NaN.
0113:             * <li>If the argument is zero, then the result is a zero with the
0114:             * same sign as the argument.</ul>
0115:             * 
0116:             * <p>The computed result must be within 1 ulp of the exact result.
0117:             * Results must be semi-monotonic.
0118:             *
0119:             * @param   a   an angle, in radians.
0120:             * @return  the sine of the argument.
0121:             */
0122:            public static double sin(double a) {
0123:                return StrictMath.sin(a); // default impl. delegates to StrictMath
0124:            }
0125:
0126:            /**
0127:             * Returns the trigonometric cosine of an angle. Special cases:
0128:             * <ul><li>If the argument is NaN or an infinity, then the 
0129:             * result is NaN.</ul>
0130:             * 
0131:             * <p>The computed result must be within 1 ulp of the exact result.
0132:             * Results must be semi-monotonic.
0133:             *
0134:             * @param   a   an angle, in radians.
0135:             * @return  the cosine of the argument.
0136:             */
0137:            public static double cos(double a) {
0138:                return StrictMath.cos(a); // default impl. delegates to StrictMath
0139:            }
0140:
0141:            /**
0142:             * Returns the trigonometric tangent of an angle.  Special cases:
0143:             * <ul><li>If the argument is NaN or an infinity, then the result 
0144:             * is NaN.
0145:             * <li>If the argument is zero, then the result is a zero with the
0146:             * same sign as the argument.</ul>
0147:             * 
0148:             * <p>The computed result must be within 1 ulp of the exact result.
0149:             * Results must be semi-monotonic.
0150:             *
0151:             * @param   a   an angle, in radians.
0152:             * @return  the tangent of the argument.
0153:             */
0154:            public static double tan(double a) {
0155:                return StrictMath.tan(a); // default impl. delegates to StrictMath
0156:            }
0157:
0158:            /**
0159:             * Returns the arc sine of a value; the returned angle is in the
0160:             * range -<i>pi</i>/2 through <i>pi</i>/2.  Special cases:
0161:             * <ul><li>If the argument is NaN or its absolute value is greater 
0162:             * than 1, then the result is NaN.
0163:             * <li>If the argument is zero, then the result is a zero with the
0164:             * same sign as the argument.</ul>
0165:             * 
0166:             * <p>The computed result must be within 1 ulp of the exact result.
0167:             * Results must be semi-monotonic.
0168:             *
0169:             * @param   a   the value whose arc sine is to be returned.
0170:             * @return  the arc sine of the argument.
0171:             */
0172:            public static double asin(double a) {
0173:                return StrictMath.asin(a); // default impl. delegates to StrictMath
0174:            }
0175:
0176:            /**
0177:             * Returns the arc cosine of a value; the returned angle is in the
0178:             * range 0.0 through <i>pi</i>.  Special case:
0179:             * <ul><li>If the argument is NaN or its absolute value is greater 
0180:             * than 1, then the result is NaN.</ul>
0181:             * 
0182:             * <p>The computed result must be within 1 ulp of the exact result.
0183:             * Results must be semi-monotonic.
0184:             *
0185:             * @param   a   the value whose arc cosine is to be returned.
0186:             * @return  the arc cosine of the argument.
0187:             */
0188:            public static double acos(double a) {
0189:                return StrictMath.acos(a); // default impl. delegates to StrictMath
0190:            }
0191:
0192:            /**
0193:             * Returns the arc tangent of a value; the returned angle is in the
0194:             * range -<i>pi</i>/2 through <i>pi</i>/2.  Special cases:
0195:             * <ul><li>If the argument is NaN, then the result is NaN.
0196:             * <li>If the argument is zero, then the result is a zero with the
0197:             * same sign as the argument.</ul>
0198:             * 
0199:             * <p>The computed result must be within 1 ulp of the exact result.
0200:             * Results must be semi-monotonic.
0201:             *
0202:             * @param   a   the value whose arc tangent is to be returned.
0203:             * @return  the arc tangent of the argument.
0204:             */
0205:            public static double atan(double a) {
0206:                return StrictMath.atan(a); // default impl. delegates to StrictMath
0207:            }
0208:
0209:            /**
0210:             * Converts an angle measured in degrees to an approximately
0211:             * equivalent angle measured in radians.  The conversion from
0212:             * degrees to radians is generally inexact.
0213:             *
0214:             * @param   angdeg   an angle, in degrees
0215:             * @return  the measurement of the angle {@code angdeg}
0216:             *          in radians.
0217:             * @since   1.2
0218:             */
0219:            public static double toRadians(double angdeg) {
0220:                return angdeg / 180.0 * PI;
0221:            }
0222:
0223:            /**
0224:             * Converts an angle measured in radians to an approximately
0225:             * equivalent angle measured in degrees.  The conversion from
0226:             * radians to degrees is generally inexact; users should
0227:             * <i>not</i> expect {@code cos(toRadians(90.0))} to exactly
0228:             * equal {@code 0.0}.
0229:             *
0230:             * @param   angrad   an angle, in radians
0231:             * @return  the measurement of the angle {@code angrad}
0232:             *          in degrees.
0233:             * @since   1.2
0234:             */
0235:            public static double toDegrees(double angrad) {
0236:                return angrad * 180.0 / PI;
0237:            }
0238:
0239:            /**
0240:             * Returns Euler's number <i>e</i> raised to the power of a
0241:             * {@code double} value.  Special cases:
0242:             * <ul><li>If the argument is NaN, the result is NaN.
0243:             * <li>If the argument is positive infinity, then the result is 
0244:             * positive infinity.
0245:             * <li>If the argument is negative infinity, then the result is 
0246:             * positive zero.</ul>
0247:             * 
0248:             * <p>The computed result must be within 1 ulp of the exact result.
0249:             * Results must be semi-monotonic.
0250:             *
0251:             * @param   a   the exponent to raise <i>e</i> to.
0252:             * @return  the value <i>e</i><sup>{@code a}</sup>, 
0253:             *          where <i>e</i> is the base of the natural logarithms.
0254:             */
0255:            public static double exp(double a) {
0256:                return StrictMath.exp(a); // default impl. delegates to StrictMath
0257:            }
0258:
0259:            /**
0260:             * Returns the natural logarithm (base <i>e</i>) of a {@code double}
0261:             * value.  Special cases:
0262:             * <ul><li>If the argument is NaN or less than zero, then the result 
0263:             * is NaN.
0264:             * <li>If the argument is positive infinity, then the result is 
0265:             * positive infinity.
0266:             * <li>If the argument is positive zero or negative zero, then the 
0267:             * result is negative infinity.</ul>
0268:             * 
0269:             * <p>The computed result must be within 1 ulp of the exact result.
0270:             * Results must be semi-monotonic.
0271:             *
0272:             * @param   a   a value
0273:             * @return  the value ln&nbsp;{@code a}, the natural logarithm of
0274:             *          {@code a}.
0275:             */
0276:            public static double log(double a) {
0277:                return StrictMath.log(a); // default impl. delegates to StrictMath
0278:            }
0279:
0280:            /**
0281:             * Returns the base 10 logarithm of a {@code double} value.
0282:             * Special cases:
0283:             *
0284:             * <ul><li>If the argument is NaN or less than zero, then the result 
0285:             * is NaN.
0286:             * <li>If the argument is positive infinity, then the result is 
0287:             * positive infinity.
0288:             * <li>If the argument is positive zero or negative zero, then the 
0289:             * result is negative infinity.
0290:             * <li> If the argument is equal to 10<sup><i>n</i></sup> for
0291:             * integer <i>n</i>, then the result is <i>n</i>.
0292:             * </ul>
0293:             * 
0294:             * <p>The computed result must be within 1 ulp of the exact result.
0295:             * Results must be semi-monotonic.
0296:             *
0297:             * @param   a   a value
0298:             * @return  the base 10 logarithm of  {@code a}.
0299:             * @since 1.5
0300:             */
0301:            public static double log10(double a) {
0302:                return StrictMath.log10(a); // default impl. delegates to StrictMath
0303:            }
0304:
0305:            /**
0306:             * Returns the correctly rounded positive square root of a 
0307:             * {@code double} value.
0308:             * Special cases:
0309:             * <ul><li>If the argument is NaN or less than zero, then the result 
0310:             * is NaN. 
0311:             * <li>If the argument is positive infinity, then the result is positive 
0312:             * infinity. 
0313:             * <li>If the argument is positive zero or negative zero, then the 
0314:             * result is the same as the argument.</ul>
0315:             * Otherwise, the result is the {@code double} value closest to 
0316:             * the true mathematical square root of the argument value.
0317:             * 
0318:             * @param   a   a value.
0319:             * @return  the positive square root of {@code a}.
0320:             *          If the argument is NaN or less than zero, the result is NaN.
0321:             */
0322:            public static double sqrt(double a) {
0323:                return StrictMath.sqrt(a); // default impl. delegates to StrictMath
0324:                // Note that hardware sqrt instructions
0325:                // frequently can be directly used by JITs
0326:                // and should be much faster than doing
0327:                // Math.sqrt in software.
0328:            }
0329:
0330:            /**
0331:             * Returns the cube root of a {@code double} value.  For
0332:             * positive finite {@code x}, {@code cbrt(-x) ==
0333:             * -cbrt(x)}; that is, the cube root of a negative value is
0334:             * the negative of the cube root of that value's magnitude.
0335:             * 
0336:             * Special cases: 
0337:             *
0338:             * <ul>
0339:             * 
0340:             * <li>If the argument is NaN, then the result is NaN.
0341:             *
0342:             * <li>If the argument is infinite, then the result is an infinity
0343:             * with the same sign as the argument.
0344:             *
0345:             * <li>If the argument is zero, then the result is a zero with the
0346:             * same sign as the argument.
0347:             * 
0348:             * </ul>
0349:             *
0350:             * <p>The computed result must be within 1 ulp of the exact result.
0351:             * 
0352:             * @param   a   a value.
0353:             * @return  the cube root of {@code a}.
0354:             * @since 1.5
0355:             */
0356:            public static double cbrt(double a) {
0357:                return StrictMath.cbrt(a);
0358:            }
0359:
0360:            /**
0361:             * Computes the remainder operation on two arguments as prescribed 
0362:             * by the IEEE 754 standard.
0363:             * The remainder value is mathematically equal to 
0364:             * <code>f1&nbsp;-&nbsp;f2</code>&nbsp;&times;&nbsp;<i>n</i>,
0365:             * where <i>n</i> is the mathematical integer closest to the exact 
0366:             * mathematical value of the quotient {@code f1/f2}, and if two 
0367:             * mathematical integers are equally close to {@code f1/f2}, 
0368:             * then <i>n</i> is the integer that is even. If the remainder is 
0369:             * zero, its sign is the same as the sign of the first argument. 
0370:             * Special cases:
0371:             * <ul><li>If either argument is NaN, or the first argument is infinite, 
0372:             * or the second argument is positive zero or negative zero, then the 
0373:             * result is NaN.
0374:             * <li>If the first argument is finite and the second argument is 
0375:             * infinite, then the result is the same as the first argument.</ul>
0376:             *
0377:             * @param   f1   the dividend.
0378:             * @param   f2   the divisor.
0379:             * @return  the remainder when {@code f1} is divided by
0380:             *          {@code f2}.
0381:             */
0382:            public static double IEEEremainder(double f1, double f2) {
0383:                return StrictMath.IEEEremainder(f1, f2); // delegate to StrictMath
0384:            }
0385:
0386:            /**
0387:             * Returns the smallest (closest to negative infinity)
0388:             * {@code double} value that is greater than or equal to the
0389:             * argument and is equal to a mathematical integer. Special cases:
0390:             * <ul><li>If the argument value is already equal to a
0391:             * mathematical integer, then the result is the same as the
0392:             * argument.  <li>If the argument is NaN or an infinity or
0393:             * positive zero or negative zero, then the result is the same as
0394:             * the argument.  <li>If the argument value is less than zero but
0395:             * greater than -1.0, then the result is negative zero.</ul> Note
0396:             * that the value of {@code Math.ceil(x)} is exactly the
0397:             * value of {@code -Math.floor(-x)}.
0398:             *
0399:             *
0400:             * @param   a   a value.
0401:             * @return  the smallest (closest to negative infinity) 
0402:             *          floating-point value that is greater than or equal to 
0403:             *          the argument and is equal to a mathematical integer. 
0404:             */
0405:            public static double ceil(double a) {
0406:                return StrictMath.ceil(a); // default impl. delegates to StrictMath
0407:            }
0408:
0409:            /**
0410:             * Returns the largest (closest to positive infinity)
0411:             * {@code double} value that is less than or equal to the
0412:             * argument and is equal to a mathematical integer. Special cases:
0413:             * <ul><li>If the argument value is already equal to a
0414:             * mathematical integer, then the result is the same as the
0415:             * argument.  <li>If the argument is NaN or an infinity or
0416:             * positive zero or negative zero, then the result is the same as
0417:             * the argument.</ul>
0418:             *
0419:             * @param   a   a value.
0420:             * @return  the largest (closest to positive infinity) 
0421:             *          floating-point value that less than or equal to the argument
0422:             *          and is equal to a mathematical integer. 
0423:             */
0424:            public static double floor(double a) {
0425:                return StrictMath.floor(a); // default impl. delegates to StrictMath
0426:            }
0427:
0428:            /**
0429:             * Returns the {@code double} value that is closest in value
0430:             * to the argument and is equal to a mathematical integer. If two
0431:             * {@code double} values that are mathematical integers are
0432:             * equally close, the result is the integer value that is
0433:             * even. Special cases:
0434:             * <ul><li>If the argument value is already equal to a mathematical 
0435:             * integer, then the result is the same as the argument. 
0436:             * <li>If the argument is NaN or an infinity or positive zero or negative 
0437:             * zero, then the result is the same as the argument.</ul>
0438:             *
0439:             * @param   a   a {@code double} value.
0440:             * @return  the closest floating-point value to {@code a} that is
0441:             *          equal to a mathematical integer.
0442:             */
0443:            public static double rint(double a) {
0444:                return StrictMath.rint(a); // default impl. delegates to StrictMath
0445:            }
0446:
0447:            /**
0448:             * Returns the angle <i>theta</i> from the conversion of rectangular
0449:             * coordinates ({@code x},&nbsp;{@code y}) to polar
0450:             * coordinates (r,&nbsp;<i>theta</i>).
0451:             * This method computes the phase <i>theta</i> by computing an arc tangent
0452:             * of {@code y/x} in the range of -<i>pi</i> to <i>pi</i>. Special 
0453:             * cases:
0454:             * <ul><li>If either argument is NaN, then the result is NaN. 
0455:             * <li>If the first argument is positive zero and the second argument 
0456:             * is positive, or the first argument is positive and finite and the 
0457:             * second argument is positive infinity, then the result is positive 
0458:             * zero. 
0459:             * <li>If the first argument is negative zero and the second argument 
0460:             * is positive, or the first argument is negative and finite and the 
0461:             * second argument is positive infinity, then the result is negative zero. 
0462:             * <li>If the first argument is positive zero and the second argument 
0463:             * is negative, or the first argument is positive and finite and the 
0464:             * second argument is negative infinity, then the result is the 
0465:             * {@code double} value closest to <i>pi</i>. 
0466:             * <li>If the first argument is negative zero and the second argument 
0467:             * is negative, or the first argument is negative and finite and the 
0468:             * second argument is negative infinity, then the result is the 
0469:             * {@code double} value closest to -<i>pi</i>. 
0470:             * <li>If the first argument is positive and the second argument is 
0471:             * positive zero or negative zero, or the first argument is positive 
0472:             * infinity and the second argument is finite, then the result is the 
0473:             * {@code double} value closest to <i>pi</i>/2. 
0474:             * <li>If the first argument is negative and the second argument is 
0475:             * positive zero or negative zero, or the first argument is negative 
0476:             * infinity and the second argument is finite, then the result is the 
0477:             * {@code double} value closest to -<i>pi</i>/2. 
0478:             * <li>If both arguments are positive infinity, then the result is the 
0479:             * {@code double} value closest to <i>pi</i>/4. 
0480:             * <li>If the first argument is positive infinity and the second argument 
0481:             * is negative infinity, then the result is the {@code double} 
0482:             * value closest to 3*<i>pi</i>/4. 
0483:             * <li>If the first argument is negative infinity and the second argument 
0484:             * is positive infinity, then the result is the {@code double} value 
0485:             * closest to -<i>pi</i>/4. 
0486:             * <li>If both arguments are negative infinity, then the result is the 
0487:             * {@code double} value closest to -3*<i>pi</i>/4.</ul>
0488:             * 
0489:             * <p>The computed result must be within 2 ulps of the exact result.
0490:             * Results must be semi-monotonic.
0491:             *
0492:             * @param   y   the ordinate coordinate
0493:             * @param   x   the abscissa coordinate
0494:             * @return  the <i>theta</i> component of the point
0495:             *          (<i>r</i>,&nbsp;<i>theta</i>)
0496:             *          in polar coordinates that corresponds to the point
0497:             *          (<i>x</i>,&nbsp;<i>y</i>) in Cartesian coordinates.
0498:             */
0499:            public static double atan2(double y, double x) {
0500:                return StrictMath.atan2(y, x); // default impl. delegates to StrictMath
0501:            }
0502:
0503:            /**
0504:             * Returns the value of the first argument raised to the power of the
0505:             * second argument. Special cases:
0506:             *
0507:             * <ul><li>If the second argument is positive or negative zero, then the 
0508:             * result is 1.0. 
0509:             * <li>If the second argument is 1.0, then the result is the same as the 
0510:             * first argument.
0511:             * <li>If the second argument is NaN, then the result is NaN. 
0512:             * <li>If the first argument is NaN and the second argument is nonzero, 
0513:             * then the result is NaN. 
0514:             *
0515:             * <li>If
0516:             * <ul>
0517:             * <li>the absolute value of the first argument is greater than 1
0518:             * and the second argument is positive infinity, or
0519:             * <li>the absolute value of the first argument is less than 1 and
0520:             * the second argument is negative infinity,
0521:             * </ul>
0522:             * then the result is positive infinity. 
0523:             *
0524:             * <li>If 
0525:             * <ul>
0526:             * <li>the absolute value of the first argument is greater than 1 and 
0527:             * the second argument is negative infinity, or 
0528:             * <li>the absolute value of the 
0529:             * first argument is less than 1 and the second argument is positive 
0530:             * infinity,
0531:             * </ul>
0532:             * then the result is positive zero. 
0533:             *
0534:             * <li>If the absolute value of the first argument equals 1 and the 
0535:             * second argument is infinite, then the result is NaN. 
0536:             *
0537:             * <li>If 
0538:             * <ul>
0539:             * <li>the first argument is positive zero and the second argument
0540:             * is greater than zero, or
0541:             * <li>the first argument is positive infinity and the second
0542:             * argument is less than zero,
0543:             * </ul>
0544:             * then the result is positive zero. 
0545:             *
0546:             * <li>If 
0547:             * <ul>
0548:             * <li>the first argument is positive zero and the second argument
0549:             * is less than zero, or
0550:             * <li>the first argument is positive infinity and the second
0551:             * argument is greater than zero,
0552:             * </ul>
0553:             * then the result is positive infinity.
0554:             *
0555:             * <li>If 
0556:             * <ul>
0557:             * <li>the first argument is negative zero and the second argument
0558:             * is greater than zero but not a finite odd integer, or
0559:             * <li>the first argument is negative infinity and the second
0560:             * argument is less than zero but not a finite odd integer,
0561:             * </ul>
0562:             * then the result is positive zero. 
0563:             *
0564:             * <li>If 
0565:             * <ul>
0566:             * <li>the first argument is negative zero and the second argument
0567:             * is a positive finite odd integer, or
0568:             * <li>the first argument is negative infinity and the second
0569:             * argument is a negative finite odd integer,
0570:             * </ul>
0571:             * then the result is negative zero. 
0572:             *
0573:             * <li>If
0574:             * <ul>
0575:             * <li>the first argument is negative zero and the second argument
0576:             * is less than zero but not a finite odd integer, or
0577:             * <li>the first argument is negative infinity and the second
0578:             * argument is greater than zero but not a finite odd integer,
0579:             * </ul>
0580:             * then the result is positive infinity. 
0581:             *
0582:             * <li>If 
0583:             * <ul>
0584:             * <li>the first argument is negative zero and the second argument
0585:             * is a negative finite odd integer, or
0586:             * <li>the first argument is negative infinity and the second
0587:             * argument is a positive finite odd integer,
0588:             * </ul>
0589:             * then the result is negative infinity. 
0590:             *
0591:             * <li>If the first argument is finite and less than zero
0592:             * <ul>
0593:             * <li> if the second argument is a finite even integer, the
0594:             * result is equal to the result of raising the absolute value of
0595:             * the first argument to the power of the second argument
0596:             *
0597:             * <li>if the second argument is a finite odd integer, the result
0598:             * is equal to the negative of the result of raising the absolute
0599:             * value of the first argument to the power of the second
0600:             * argument
0601:             *
0602:             * <li>if the second argument is finite and not an integer, then
0603:             * the result is NaN.
0604:             * </ul>
0605:             *
0606:             * <li>If both arguments are integers, then the result is exactly equal 
0607:             * to the mathematical result of raising the first argument to the power 
0608:             * of the second argument if that result can in fact be represented 
0609:             * exactly as a {@code double} value.</ul>
0610:             * 
0611:             * <p>(In the foregoing descriptions, a floating-point value is
0612:             * considered to be an integer if and only if it is finite and a
0613:             * fixed point of the method {@link #ceil ceil} or,
0614:             * equivalently, a fixed point of the method {@link #floor
0615:             * floor}. A value is a fixed point of a one-argument
0616:             * method if and only if the result of applying the method to the
0617:             * value is equal to the value.)
0618:             *
0619:             * <p>The computed result must be within 1 ulp of the exact result.
0620:             * Results must be semi-monotonic.
0621:             *
0622:             * @param   a   the base.
0623:             * @param   b   the exponent.
0624:             * @return  the value {@code a}<sup>{@code b}</sup>.
0625:             */
0626:            public static double pow(double a, double b) {
0627:                return StrictMath.pow(a, b); // default impl. delegates to StrictMath
0628:            }
0629:
0630:            /**
0631:             * Returns the closest {@code int} to the argument. The 
0632:             * result is rounded to an integer by adding 1/2, taking the 
0633:             * floor of the result, and casting the result to type {@code int}. 
0634:             * In other words, the result is equal to the value of the expression:
0635:             * <p>{@code (int)Math.floor(a + 0.5f)}
0636:             * <p>
0637:             * Special cases:
0638:             * <ul><li>If the argument is NaN, the result is 0.
0639:             * <li>If the argument is negative infinity or any value less than or 
0640:             * equal to the value of {@code Integer.MIN_VALUE}, the result is 
0641:             * equal to the value of {@code Integer.MIN_VALUE}. 
0642:             * <li>If the argument is positive infinity or any value greater than or 
0643:             * equal to the value of {@code Integer.MAX_VALUE}, the result is 
0644:             * equal to the value of {@code Integer.MAX_VALUE}.</ul> 
0645:             *
0646:             * @param   a   a floating-point value to be rounded to an integer.
0647:             * @return  the value of the argument rounded to the nearest
0648:             *          {@code int} value.
0649:             * @see     java.lang.Integer#MAX_VALUE
0650:             * @see     java.lang.Integer#MIN_VALUE
0651:             */
0652:            public static int round(float a) {
0653:                return (int) floor(a + 0.5f);
0654:            }
0655:
0656:            /**
0657:             * Returns the closest {@code long} to the argument. The result 
0658:             * is rounded to an integer by adding 1/2, taking the floor of the 
0659:             * result, and casting the result to type {@code long}. In other 
0660:             * words, the result is equal to the value of the expression:
0661:             * <p>{@code (long)Math.floor(a + 0.5d)}
0662:             * <p>
0663:             * Special cases:
0664:             * <ul><li>If the argument is NaN, the result is 0.
0665:             * <li>If the argument is negative infinity or any value less than or 
0666:             * equal to the value of {@code Long.MIN_VALUE}, the result is 
0667:             * equal to the value of {@code Long.MIN_VALUE}. 
0668:             * <li>If the argument is positive infinity or any value greater than or 
0669:             * equal to the value of {@code Long.MAX_VALUE}, the result is 
0670:             * equal to the value of {@code Long.MAX_VALUE}.</ul> 
0671:             *
0672:             * @param   a   a floating-point value to be rounded to a 
0673:             *		{@code long}.
0674:             * @return  the value of the argument rounded to the nearest
0675:             *          {@code long} value.
0676:             * @see     java.lang.Long#MAX_VALUE
0677:             * @see     java.lang.Long#MIN_VALUE
0678:             */
0679:            public static long round(double a) {
0680:                return (long) floor(a + 0.5d);
0681:            }
0682:
0683:            private static Random randomNumberGenerator;
0684:
0685:            private static synchronized void initRNG() {
0686:                if (randomNumberGenerator == null)
0687:                    randomNumberGenerator = new Random();
0688:            }
0689:
0690:            /**
0691:             * Returns a {@code double} value with a positive sign, greater 
0692:             * than or equal to {@code 0.0} and less than {@code 1.0}. 
0693:             * Returned values are chosen pseudorandomly with (approximately) 
0694:             * uniform distribution from that range. 
0695:             * 
0696:             * <p>When this method is first called, it creates a single new
0697:             * pseudorandom-number generator, exactly as if by the expression
0698:             * <blockquote>{@code new java.util.Random}</blockquote> This
0699:             * new pseudorandom-number generator is used thereafter for all
0700:             * calls to this method and is used nowhere else.
0701:             * 
0702:             * <p>This method is properly synchronized to allow correct use by
0703:             * more than one thread. However, if many threads need to generate
0704:             * pseudorandom numbers at a great rate, it may reduce contention
0705:             * for each thread to have its own pseudorandom-number generator.
0706:             *  
0707:             * @return  a pseudorandom {@code double} greater than or equal 
0708:             * to {@code 0.0} and less than {@code 1.0}.
0709:             * @see     java.util.Random#nextDouble()
0710:             */
0711:            public static double random() {
0712:                if (randomNumberGenerator == null)
0713:                    initRNG();
0714:                return randomNumberGenerator.nextDouble();
0715:            }
0716:
0717:            /**
0718:             * Returns the absolute value of an {@code int} value.
0719:             * If the argument is not negative, the argument is returned.
0720:             * If the argument is negative, the negation of the argument is returned. 
0721:             * 
0722:             * <p>Note that if the argument is equal to the value of
0723:             * {@link Integer#MIN_VALUE}, the most negative representable
0724:             * {@code int} value, the result is that same value, which is
0725:             * negative.
0726:             *
0727:             * @param   a   the argument whose absolute value is to be determined
0728:             * @return  the absolute value of the argument.
0729:             */
0730:            public static int abs(int a) {
0731:                return (a < 0) ? -a : a;
0732:            }
0733:
0734:            /**
0735:             * Returns the absolute value of a {@code long} value.
0736:             * If the argument is not negative, the argument is returned.
0737:             * If the argument is negative, the negation of the argument is returned. 
0738:             * 
0739:             * <p>Note that if the argument is equal to the value of
0740:             * {@link Long#MIN_VALUE}, the most negative representable
0741:             * {@code long} value, the result is that same value, which
0742:             * is negative.
0743:             *
0744:             * @param   a   the argument whose absolute value is to be determined
0745:             * @return  the absolute value of the argument.
0746:             */
0747:            public static long abs(long a) {
0748:                return (a < 0) ? -a : a;
0749:            }
0750:
0751:            /**
0752:             * Returns the absolute value of a {@code float} value.
0753:             * If the argument is not negative, the argument is returned.
0754:             * If the argument is negative, the negation of the argument is returned.
0755:             * Special cases:
0756:             * <ul><li>If the argument is positive zero or negative zero, the 
0757:             * result is positive zero. 
0758:             * <li>If the argument is infinite, the result is positive infinity. 
0759:             * <li>If the argument is NaN, the result is NaN.</ul>
0760:             * In other words, the result is the same as the value of the expression: 
0761:             * <p>{@code Float.intBitsToFloat(0x7fffffff & Float.floatToIntBits(a))}
0762:             *
0763:             * @param   a   the argument whose absolute value is to be determined
0764:             * @return  the absolute value of the argument.
0765:             */
0766:            public static float abs(float a) {
0767:                return (a <= 0.0F) ? 0.0F - a : a;
0768:            }
0769:
0770:            /**
0771:             * Returns the absolute value of a {@code double} value.
0772:             * If the argument is not negative, the argument is returned.
0773:             * If the argument is negative, the negation of the argument is returned.
0774:             * Special cases:
0775:             * <ul><li>If the argument is positive zero or negative zero, the result 
0776:             * is positive zero. 
0777:             * <li>If the argument is infinite, the result is positive infinity. 
0778:             * <li>If the argument is NaN, the result is NaN.</ul>
0779:             * In other words, the result is the same as the value of the expression: 
0780:             * <p>{@code Double.longBitsToDouble((Double.doubleToLongBits(a)<<1)>>>1)} 
0781:             *
0782:             * @param   a   the argument whose absolute value is to be determined
0783:             * @return  the absolute value of the argument.
0784:             */
0785:            public static double abs(double a) {
0786:                return (a <= 0.0D) ? 0.0D - a : a;
0787:            }
0788:
0789:            /**
0790:             * Returns the greater of two {@code int} values. That is, the 
0791:             * result is the argument closer to the value of 
0792:             * {@link Integer#MAX_VALUE}. If the arguments have the same value, 
0793:             * the result is that same value.
0794:             *
0795:             * @param   a   an argument.
0796:             * @param   b   another argument.
0797:             * @return  the larger of {@code a} and {@code b}.
0798:             */
0799:            public static int max(int a, int b) {
0800:                return (a >= b) ? a : b;
0801:            }
0802:
0803:            /**
0804:             * Returns the greater of two {@code long} values. That is, the 
0805:             * result is the argument closer to the value of 
0806:             * {@link Long#MAX_VALUE}. If the arguments have the same value, 
0807:             * the result is that same value. 
0808:             *
0809:             * @param   a   an argument.
0810:             * @param   b   another argument.
0811:             * @return  the larger of {@code a} and {@code b}.
0812:             */
0813:            public static long max(long a, long b) {
0814:                return (a >= b) ? a : b;
0815:            }
0816:
0817:            private static long negativeZeroFloatBits = Float
0818:                    .floatToIntBits(-0.0f);
0819:            private static long negativeZeroDoubleBits = Double
0820:                    .doubleToLongBits(-0.0d);
0821:
0822:            /**
0823:             * Returns the greater of two {@code float} values.  That is,
0824:             * the result is the argument closer to positive infinity. If the
0825:             * arguments have the same value, the result is that same
0826:             * value. If either value is NaN, then the result is NaN.  Unlike
0827:             * the numerical comparison operators, this method considers
0828:             * negative zero to be strictly smaller than positive zero. If one
0829:             * argument is positive zero and the other negative zero, the
0830:             * result is positive zero.
0831:             *
0832:             * @param   a   an argument.
0833:             * @param   b   another argument.
0834:             * @return  the larger of {@code a} and {@code b}.
0835:             */
0836:            public static float max(float a, float b) {
0837:                if (a != a)
0838:                    return a; // a is NaN
0839:                if ((a == 0.0f) && (b == 0.0f)
0840:                        && (Float.floatToIntBits(a) == negativeZeroFloatBits)) {
0841:                    return b;
0842:                }
0843:                return (a >= b) ? a : b;
0844:            }
0845:
0846:            /**
0847:             * Returns the greater of two {@code double} values.  That
0848:             * is, the result is the argument closer to positive infinity. If
0849:             * the arguments have the same value, the result is that same
0850:             * value. If either value is NaN, then the result is NaN.  Unlike
0851:             * the numerical comparison operators, this method considers
0852:             * negative zero to be strictly smaller than positive zero. If one
0853:             * argument is positive zero and the other negative zero, the
0854:             * result is positive zero.
0855:             *
0856:             * @param   a   an argument.
0857:             * @param   b   another argument.
0858:             * @return  the larger of {@code a} and {@code b}.
0859:             */
0860:            public static double max(double a, double b) {
0861:                if (a != a)
0862:                    return a; // a is NaN
0863:                if ((a == 0.0d)
0864:                        && (b == 0.0d)
0865:                        && (Double.doubleToLongBits(a) == negativeZeroDoubleBits)) {
0866:                    return b;
0867:                }
0868:                return (a >= b) ? a : b;
0869:            }
0870:
0871:            /**
0872:             * Returns the smaller of two {@code int} values. That is,
0873:             * the result the argument closer to the value of
0874:             * {@link Integer#MIN_VALUE}.  If the arguments have the same
0875:             * value, the result is that same value.
0876:             *
0877:             * @param   a   an argument.
0878:             * @param   b   another argument.
0879:             * @return  the smaller of {@code a} and {@code b}.
0880:             */
0881:            public static int min(int a, int b) {
0882:                return (a <= b) ? a : b;
0883:            }
0884:
0885:            /**
0886:             * Returns the smaller of two {@code long} values. That is,
0887:             * the result is the argument closer to the value of
0888:             * {@link Long#MIN_VALUE}. If the arguments have the same
0889:             * value, the result is that same value.
0890:             *
0891:             * @param   a   an argument.
0892:             * @param   b   another argument.
0893:             * @return  the smaller of {@code a} and {@code b}.
0894:             */
0895:            public static long min(long a, long b) {
0896:                return (a <= b) ? a : b;
0897:            }
0898:
0899:            /**
0900:             * Returns the smaller of two {@code float} values.  That is,
0901:             * the result is the value closer to negative infinity. If the
0902:             * arguments have the same value, the result is that same
0903:             * value. If either value is NaN, then the result is NaN.  Unlike
0904:             * the numerical comparison operators, this method considers
0905:             * negative zero to be strictly smaller than positive zero.  If
0906:             * one argument is positive zero and the other is negative zero,
0907:             * the result is negative zero.
0908:             *
0909:             * @param   a   an argument.
0910:             * @param   b   another argument.
0911:             * @return  the smaller of {@code a} and {@code b}.
0912:             */
0913:            public static float min(float a, float b) {
0914:                if (a != a)
0915:                    return a; // a is NaN
0916:                if ((a == 0.0f) && (b == 0.0f)
0917:                        && (Float.floatToIntBits(b) == negativeZeroFloatBits)) {
0918:                    return b;
0919:                }
0920:                return (a <= b) ? a : b;
0921:            }
0922:
0923:            /**
0924:             * Returns the smaller of two {@code double} values.  That
0925:             * is, the result is the value closer to negative infinity. If the
0926:             * arguments have the same value, the result is that same
0927:             * value. If either value is NaN, then the result is NaN.  Unlike
0928:             * the numerical comparison operators, this method considers
0929:             * negative zero to be strictly smaller than positive zero. If one
0930:             * argument is positive zero and the other is negative zero, the
0931:             * result is negative zero.
0932:             *
0933:             * @param   a   an argument.
0934:             * @param   b   another argument.
0935:             * @return  the smaller of {@code a} and {@code b}.
0936:             */
0937:            public static double min(double a, double b) {
0938:                if (a != a)
0939:                    return a; // a is NaN
0940:                if ((a == 0.0d)
0941:                        && (b == 0.0d)
0942:                        && (Double.doubleToLongBits(b) == negativeZeroDoubleBits)) {
0943:                    return b;
0944:                }
0945:                return (a <= b) ? a : b;
0946:            }
0947:
0948:            /**
0949:             * Returns the size of an ulp of the argument.  An ulp of a
0950:             * {@code double} value is the positive distance between this
0951:             * floating-point value and the {@code double} value next
0952:             * larger in magnitude.  Note that for non-NaN <i>x</i>,
0953:             * <code>ulp(-<i>x</i>) == ulp(<i>x</i>)</code>.
0954:             * 
0955:             * <p>Special Cases:
0956:             * <ul>
0957:             * <li> If the argument is NaN, then the result is NaN.
0958:             * <li> If the argument is positive or negative infinity, then the
0959:             * result is positive infinity.
0960:             * <li> If the argument is positive or negative zero, then the result is
0961:             * {@code Double.MIN_VALUE}.
0962:             * <li> If the argument is &plusmn;{@code Double.MAX_VALUE}, then
0963:             * the result is equal to 2<sup>971</sup>.
0964:             * </ul>
0965:             *
0966:             * @param d the floating-point value whose ulp is to be returned
0967:             * @return the size of an ulp of the argument
0968:             * @author Joseph D. Darcy
0969:             * @since 1.5
0970:             */
0971:            public static double ulp(double d) {
0972:                return sun.misc.FpUtils.ulp(d);
0973:            }
0974:
0975:            /**
0976:             * Returns the size of an ulp of the argument.  An ulp of a
0977:             * {@code float} value is the positive distance between this
0978:             * floating-point value and the {@code float} value next
0979:             * larger in magnitude.  Note that for non-NaN <i>x</i>,
0980:             * <code>ulp(-<i>x</i>) == ulp(<i>x</i>)</code>.
0981:             * 
0982:             * <p>Special Cases:
0983:             * <ul>
0984:             * <li> If the argument is NaN, then the result is NaN.
0985:             * <li> If the argument is positive or negative infinity, then the
0986:             * result is positive infinity.
0987:             * <li> If the argument is positive or negative zero, then the result is
0988:             * {@code Float.MIN_VALUE}.
0989:             * <li> If the argument is &plusmn;{@code Float.MAX_VALUE}, then
0990:             * the result is equal to 2<sup>104</sup>.
0991:             * </ul>
0992:             *
0993:             * @param f the floating-point value whose ulp is to be returned
0994:             * @return the size of an ulp of the argument
0995:             * @author Joseph D. Darcy
0996:             * @since 1.5
0997:             */
0998:            public static float ulp(float f) {
0999:                return sun.misc.FpUtils.ulp(f);
1000:            }
1001:
1002:            /**
1003:             * Returns the signum function of the argument; zero if the argument
1004:             * is zero, 1.0 if the argument is greater than zero, -1.0 if the
1005:             * argument is less than zero.
1006:             *
1007:             * <p>Special Cases:
1008:             * <ul>
1009:             * <li> If the argument is NaN, then the result is NaN.
1010:             * <li> If the argument is positive zero or negative zero, then the
1011:             *      result is the same as the argument.
1012:             * </ul>
1013:             *
1014:             * @param d the floating-point value whose signum is to be returned
1015:             * @return the signum function of the argument
1016:             * @author Joseph D. Darcy
1017:             * @since 1.5
1018:             */
1019:            public static double signum(double d) {
1020:                return sun.misc.FpUtils.signum(d);
1021:            }
1022:
1023:            /**
1024:             * Returns the signum function of the argument; zero if the argument
1025:             * is zero, 1.0f if the argument is greater than zero, -1.0f if the
1026:             * argument is less than zero.
1027:             *
1028:             * <p>Special Cases:
1029:             * <ul>
1030:             * <li> If the argument is NaN, then the result is NaN.
1031:             * <li> If the argument is positive zero or negative zero, then the
1032:             *      result is the same as the argument.
1033:             * </ul>
1034:             *
1035:             * @param f the floating-point value whose signum is to be returned
1036:             * @return the signum function of the argument
1037:             * @author Joseph D. Darcy
1038:             * @since 1.5
1039:             */
1040:            public static float signum(float f) {
1041:                return sun.misc.FpUtils.signum(f);
1042:            }
1043:
1044:            /**
1045:             * Returns the hyperbolic sine of a {@code double} value.
1046:             * The hyperbolic sine of <i>x</i> is defined to be
1047:             * (<i>e<sup>x</sup>&nbsp;-&nbsp;e<sup>-x</sup></i>)/2
1048:             * where <i>e</i> is {@linkplain Math#E Euler's number}.
1049:             *
1050:             * <p>Special cases:
1051:             * <ul>
1052:             *
1053:             * <li>If the argument is NaN, then the result is NaN.
1054:             *
1055:             * <li>If the argument is infinite, then the result is an infinity
1056:             * with the same sign as the argument.
1057:             *
1058:             * <li>If the argument is zero, then the result is a zero with the
1059:             * same sign as the argument.
1060:             *
1061:             * </ul>
1062:             *
1063:             * <p>The computed result must be within 2.5 ulps of the exact result.
1064:             *
1065:             * @param   x The number whose hyperbolic sine is to be returned.
1066:             * @return  The hyperbolic sine of {@code x}.
1067:             * @since 1.5
1068:             */
1069:            public static double sinh(double x) {
1070:                return StrictMath.sinh(x);
1071:            }
1072:
1073:            /**
1074:             * Returns the hyperbolic cosine of a {@code double} value.
1075:             * The hyperbolic cosine of <i>x</i> is defined to be
1076:             * (<i>e<sup>x</sup>&nbsp;+&nbsp;e<sup>-x</sup></i>)/2
1077:             * where <i>e</i> is {@linkplain Math#E Euler's number}.
1078:             *
1079:             * <p>Special cases:
1080:             * <ul>
1081:             *
1082:             * <li>If the argument is NaN, then the result is NaN.
1083:             *
1084:             * <li>If the argument is infinite, then the result is positive
1085:             * infinity.
1086:             *
1087:             * <li>If the argument is zero, then the result is {@code 1.0}.
1088:             *
1089:             * </ul>
1090:             *
1091:             * <p>The computed result must be within 2.5 ulps of the exact result.
1092:             *
1093:             * @param   x The number whose hyperbolic cosine is to be returned.
1094:             * @return  The hyperbolic cosine of {@code x}.
1095:             * @since 1.5
1096:             */
1097:            public static double cosh(double x) {
1098:                return StrictMath.cosh(x);
1099:            }
1100:
1101:            /**
1102:             * Returns the hyperbolic tangent of a {@code double} value.
1103:             * The hyperbolic tangent of <i>x</i> is defined to be
1104:             * (<i>e<sup>x</sup>&nbsp;-&nbsp;e<sup>-x</sup></i>)/(<i>e<sup>x</sup>&nbsp;+&nbsp;e<sup>-x</sup></i>),
1105:             * in other words, {@linkplain Math#sinh
1106:             * sinh(<i>x</i>)}/{@linkplain Math#cosh cosh(<i>x</i>)}.  Note
1107:             * that the absolute value of the exact tanh is always less than
1108:             * 1.
1109:             *
1110:             * <p>Special cases:
1111:             * <ul>
1112:             *
1113:             * <li>If the argument is NaN, then the result is NaN.
1114:             *
1115:             * <li>If the argument is zero, then the result is a zero with the
1116:             * same sign as the argument.
1117:             *
1118:             * <li>If the argument is positive infinity, then the result is
1119:             * {@code +1.0}.
1120:             *
1121:             * <li>If the argument is negative infinity, then the result is
1122:             * {@code -1.0}.
1123:             *  
1124:             * </ul>
1125:             *
1126:             * <p>The computed result must be within 2.5 ulps of the exact result.
1127:             * The result of {@code tanh} for any finite input must have
1128:             * an absolute value less than or equal to 1.  Note that once the
1129:             * exact result of tanh is within 1/2 of an ulp of the limit value
1130:             * of &plusmn;1, correctly signed &plusmn;{@code 1.0} should
1131:             * be returned.
1132:             *
1133:             * @param   x The number whose hyperbolic tangent is to be returned.
1134:             * @return  The hyperbolic tangent of {@code x}.
1135:             * @since 1.5
1136:             */
1137:            public static double tanh(double x) {
1138:                return StrictMath.tanh(x);
1139:            }
1140:
1141:            /**
1142:             * Returns sqrt(<i>x</i><sup>2</sup>&nbsp;+<i>y</i><sup>2</sup>)
1143:             * without intermediate overflow or underflow.
1144:             *
1145:             * <p>Special cases:
1146:             * <ul>
1147:             *
1148:             * <li> If either argument is infinite, then the result
1149:             * is positive infinity.
1150:             *
1151:             * <li> If either argument is NaN and neither argument is infinite,
1152:             * then the result is NaN.
1153:             *
1154:             * </ul>
1155:             *
1156:             * <p>The computed result must be within 1 ulp of the exact
1157:             * result.  If one parameter is held constant, the results must be
1158:             * semi-monotonic in the other parameter.
1159:             *
1160:             * @param x a value
1161:             * @param y a value
1162:             * @return sqrt(<i>x</i><sup>2</sup>&nbsp;+<i>y</i><sup>2</sup>)
1163:             * without intermediate overflow or underflow
1164:             * @since 1.5
1165:             */
1166:            public static double hypot(double x, double y) {
1167:                return StrictMath.hypot(x, y);
1168:            }
1169:
1170:            /**
1171:             * Returns <i>e</i><sup>x</sup>&nbsp;-1.  Note that for values of
1172:             * <i>x</i> near 0, the exact sum of
1173:             * {@code expm1(x)}&nbsp;+&nbsp;1 is much closer to the true
1174:             * result of <i>e</i><sup>x</sup> than {@code exp(x)}.
1175:             *
1176:             * <p>Special cases:
1177:             * <ul>
1178:             * <li>If the argument is NaN, the result is NaN.
1179:             *
1180:             * <li>If the argument is positive infinity, then the result is
1181:             * positive infinity.
1182:             *
1183:             * <li>If the argument is negative infinity, then the result is
1184:             * -1.0.
1185:             *
1186:             * <li>If the argument is zero, then the result is a zero with the
1187:             * same sign as the argument.
1188:             *
1189:             * </ul>
1190:             *
1191:             * <p>The computed result must be within 1 ulp of the exact result.
1192:             * Results must be semi-monotonic.  The result of
1193:             * {@code expm1} for any finite input must be greater than or
1194:             * equal to {@code -1.0}.  Note that once the exact result of
1195:             * <i>e</i><sup>{@code x}</sup>&nbsp;-&nbsp;1 is within 1/2
1196:             * ulp of the limit value -1, {@code -1.0} should be
1197:             * returned.
1198:             *
1199:             * @param   x   the exponent to raise <i>e</i> to in the computation of
1200:             *              <i>e</i><sup>{@code x}</sup>&nbsp;-1.
1201:             * @return  the value <i>e</i><sup>{@code x}</sup>&nbsp;-&nbsp;1.
1202:             * @since 1.5
1203:             */
1204:            public static double expm1(double x) {
1205:                return StrictMath.expm1(x);
1206:            }
1207:
1208:            /**
1209:             * Returns the natural logarithm of the sum of the argument and 1.
1210:             * Note that for small values {@code x}, the result of
1211:             * {@code log1p(x)} is much closer to the true result of ln(1
1212:             * + {@code x}) than the floating-point evaluation of
1213:             * {@code log(1.0+x)}.
1214:             *
1215:             * <p>Special cases:
1216:             *
1217:             * <ul>
1218:             *
1219:             * <li>If the argument is NaN or less than -1, then the result is
1220:             * NaN.
1221:             *
1222:             * <li>If the argument is positive infinity, then the result is
1223:             * positive infinity.
1224:             *
1225:             * <li>If the argument is negative one, then the result is
1226:             * negative infinity.
1227:             *
1228:             * <li>If the argument is zero, then the result is a zero with the
1229:             * same sign as the argument.
1230:             *
1231:             * </ul>
1232:             *
1233:             * <p>The computed result must be within 1 ulp of the exact result.
1234:             * Results must be semi-monotonic.
1235:             *
1236:             * @param   x   a value
1237:             * @return the value ln({@code x}&nbsp;+&nbsp;1), the natural
1238:             * log of {@code x}&nbsp;+&nbsp;1
1239:             * @since 1.5
1240:             */
1241:            public static double log1p(double x) {
1242:                return StrictMath.log1p(x);
1243:            }
1244:
1245:            /**
1246:             * Returns the first floating-point argument with the sign of the
1247:             * second floating-point argument.  Note that unlike the {@link
1248:             * StrictMath#copySign(double, double) StrictMath.copySign}
1249:             * method, this method does not require NaN {@code sign}
1250:             * arguments to be treated as positive values; implementations are
1251:             * permitted to treat some NaN arguments as positive and other NaN
1252:             * arguments as negative to allow greater performance.
1253:             *
1254:             * @param magnitude  the parameter providing the magnitude of the result
1255:             * @param sign   the parameter providing the sign of the result
1256:             * @return a value with the magnitude of {@code magnitude}
1257:             * and the sign of {@code sign}.
1258:             * @since 1.6
1259:             */
1260:            public static double copySign(double magnitude, double sign) {
1261:                return sun.misc.FpUtils.rawCopySign(magnitude, sign);
1262:            }
1263:
1264:            /**
1265:             * Returns the first floating-point argument with the sign of the
1266:             * second floating-point argument.  Note that unlike the {@link
1267:             * StrictMath#copySign(float, float) StrictMath.copySign}
1268:             * method, this method does not require NaN {@code sign}
1269:             * arguments to be treated as positive values; implementations are
1270:             * permitted to treat some NaN arguments as positive and other NaN
1271:             * arguments as negative to allow greater performance.
1272:             *
1273:             * @param magnitude  the parameter providing the magnitude of the result
1274:             * @param sign   the parameter providing the sign of the result
1275:             * @return a value with the magnitude of {@code magnitude}
1276:             * and the sign of {@code sign}.
1277:             * @since 1.6
1278:             */
1279:            public static float copySign(float magnitude, float sign) {
1280:                return sun.misc.FpUtils.rawCopySign(magnitude, sign);
1281:            }
1282:
1283:            /**
1284:             * Returns the unbiased exponent used in the representation of a
1285:             * {@code float}.  Special cases:
1286:             *
1287:             * <ul>
1288:             * <li>If the argument is NaN or infinite, then the result is
1289:             * {@link Float#MAX_EXPONENT} + 1.
1290:             * <li>If the argument is zero or subnormal, then the result is
1291:             * {@link Float#MIN_EXPONENT} -1.
1292:             * </ul>
1293:             * @param f a {@code float} value
1294:             * @return the unbiased exponent of the argument
1295:             * @since 1.6
1296:             */
1297:            public static int getExponent(float f) {
1298:                return sun.misc.FpUtils.getExponent(f);
1299:            }
1300:
1301:            /**
1302:             * Returns the unbiased exponent used in the representation of a
1303:             * {@code double}.  Special cases:
1304:             *
1305:             * <ul>
1306:             * <li>If the argument is NaN or infinite, then the result is
1307:             * {@link Double#MAX_EXPONENT} + 1.
1308:             * <li>If the argument is zero or subnormal, then the result is
1309:             * {@link Double#MIN_EXPONENT} -1.
1310:             * </ul>
1311:             * @param d a {@code double} value
1312:             * @return the unbiased exponent of the argument
1313:             * @since 1.6
1314:             */
1315:            public static int getExponent(double d) {
1316:                return sun.misc.FpUtils.getExponent(d);
1317:            }
1318:
1319:            /**
1320:             * Returns the floating-point number adjacent to the first
1321:             * argument in the direction of the second argument.  If both
1322:             * arguments compare as equal the second argument is returned.
1323:             *
1324:             * <p>
1325:             * Special cases:
1326:             * <ul>
1327:             * <li> If either argument is a NaN, then NaN is returned.
1328:             *
1329:             * <li> If both arguments are signed zeros, {@code direction}
1330:             * is returned unchanged (as implied by the requirement of
1331:             * returning the second argument if the arguments compare as
1332:             * equal).
1333:             *
1334:             * <li> If {@code start} is
1335:             * &plusmn;{@link Double#MIN_VALUE} and {@code direction}
1336:             * has a value such that the result should have a smaller
1337:             * magnitude, then a zero with the same sign as {@code start}
1338:             * is returned.
1339:             *
1340:             * <li> If {@code start} is infinite and
1341:             * {@code direction} has a value such that the result should
1342:             * have a smaller magnitude, {@link Double#MAX_VALUE} with the
1343:             * same sign as {@code start} is returned.
1344:             *
1345:             * <li> If {@code start} is equal to &plusmn;
1346:             * {@link Double#MAX_VALUE} and {@code direction} has a
1347:             * value such that the result should have a larger magnitude, an
1348:             * infinity with same sign as {@code start} is returned.
1349:             * </ul>
1350:             *
1351:             * @param start  starting floating-point value
1352:             * @param direction value indicating which of
1353:             * {@code start}'s neighbors or {@code start} should
1354:             * be returned
1355:             * @return The floating-point number adjacent to {@code start} in the
1356:             * direction of {@code direction}.
1357:             * @since 1.6
1358:             */
1359:            public static double nextAfter(double start, double direction) {
1360:                return sun.misc.FpUtils.nextAfter(start, direction);
1361:            }
1362:
1363:            /**
1364:             * Returns the floating-point number adjacent to the first
1365:             * argument in the direction of the second argument.  If both
1366:             * arguments compare as equal a value equivalent to the second argument
1367:             * is returned.
1368:             *
1369:             * <p>
1370:             * Special cases:
1371:             * <ul>
1372:             * <li> If either argument is a NaN, then NaN is returned.
1373:             *
1374:             * <li> If both arguments are signed zeros, a value equivalent
1375:             * to {@code direction} is returned.
1376:             *
1377:             * <li> If {@code start} is
1378:             * &plusmn;{@link Float#MIN_VALUE} and {@code direction}
1379:             * has a value such that the result should have a smaller
1380:             * magnitude, then a zero with the same sign as {@code start}
1381:             * is returned.
1382:             *
1383:             * <li> If {@code start} is infinite and
1384:             * {@code direction} has a value such that the result should
1385:             * have a smaller magnitude, {@link Float#MAX_VALUE} with the
1386:             * same sign as {@code start} is returned.
1387:             *
1388:             * <li> If {@code start} is equal to &plusmn;
1389:             * {@link Float#MAX_VALUE} and {@code direction} has a
1390:             * value such that the result should have a larger magnitude, an
1391:             * infinity with same sign as {@code start} is returned.
1392:             * </ul>
1393:             *
1394:             * @param start  starting floating-point value
1395:             * @param direction value indicating which of
1396:             * {@code start}'s neighbors or {@code start} should
1397:             * be returned
1398:             * @return The floating-point number adjacent to {@code start} in the
1399:             * direction of {@code direction}.
1400:             * @since 1.6
1401:             */
1402:            public static float nextAfter(float start, double direction) {
1403:                return sun.misc.FpUtils.nextAfter(start, direction);
1404:            }
1405:
1406:            /**
1407:             * Returns the floating-point value adjacent to {@code d} in
1408:             * the direction of positive infinity.  This method is
1409:             * semantically equivalent to {@code nextAfter(d,
1410:             * Double.POSITIVE_INFINITY)}; however, a {@code nextUp}
1411:             * implementation may run faster than its equivalent
1412:             * {@code nextAfter} call.
1413:             *
1414:             * <p>Special Cases:
1415:             * <ul>
1416:             * <li> If the argument is NaN, the result is NaN.
1417:             *
1418:             * <li> If the argument is positive infinity, the result is
1419:             * positive infinity.
1420:             *
1421:             * <li> If the argument is zero, the result is
1422:             * {@link Double#MIN_VALUE}
1423:             *
1424:             * </ul>
1425:             *
1426:             * @param d starting floating-point value
1427:             * @return The adjacent floating-point value closer to positive
1428:             * infinity.
1429:             * @since 1.6
1430:             */
1431:            public static double nextUp(double d) {
1432:                return sun.misc.FpUtils.nextUp(d);
1433:            }
1434:
1435:            /**
1436:             * Returns the floating-point value adjacent to {@code f} in
1437:             * the direction of positive infinity.  This method is
1438:             * semantically equivalent to {@code nextAfter(f,
1439:             * Float.POSITIVE_INFINITY)}; however, a {@code nextUp}
1440:             * implementation may run faster than its equivalent
1441:             * {@code nextAfter} call.
1442:             *
1443:             * <p>Special Cases:
1444:             * <ul>
1445:             * <li> If the argument is NaN, the result is NaN.
1446:             *
1447:             * <li> If the argument is positive infinity, the result is
1448:             * positive infinity.
1449:             *
1450:             * <li> If the argument is zero, the result is
1451:             * {@link Float#MIN_VALUE}
1452:             *
1453:             * </ul>
1454:             *
1455:             * @param f starting floating-point value
1456:             * @return The adjacent floating-point value closer to positive
1457:             * infinity.
1458:             * @since 1.6
1459:             */
1460:            public static float nextUp(float f) {
1461:                return sun.misc.FpUtils.nextUp(f);
1462:            }
1463:
1464:            /**
1465:             * Return {@code d} &times;
1466:             * 2<sup>{@code scaleFactor}</sup> rounded as if performed
1467:             * by a single correctly rounded floating-point multiply to a
1468:             * member of the double value set.  See the Java
1469:             * Language Specification for a discussion of floating-point
1470:             * value sets.  If the exponent of the result is between {@link
1471:             * Double#MIN_EXPONENT} and {@link Double#MAX_EXPONENT}, the
1472:             * answer is calculated exactly.  If the exponent of the result
1473:             * would be larger than {@code Double.MAX_EXPONENT}, an
1474:             * infinity is returned.  Note that if the result is subnormal,
1475:             * precision may be lost; that is, when {@code scalb(x, n)}
1476:             * is subnormal, {@code scalb(scalb(x, n), -n)} may not equal
1477:             * <i>x</i>.  When the result is non-NaN, the result has the same
1478:             * sign as {@code d}.
1479:             *
1480:             * <p>Special cases:
1481:             * <ul>
1482:             * <li> If the first argument is NaN, NaN is returned.
1483:             * <li> If the first argument is infinite, then an infinity of the
1484:             * same sign is returned.
1485:             * <li> If the first argument is zero, then a zero of the same
1486:             * sign is returned.
1487:             * </ul>
1488:             *
1489:             * @param d number to be scaled by a power of two.
1490:             * @param scaleFactor power of 2 used to scale {@code d}
1491:             * @return {@code d} &times; 2<sup>{@code scaleFactor}</sup>
1492:             * @since 1.6
1493:             */
1494:            public static double scalb(double d, int scaleFactor) {
1495:                return sun.misc.FpUtils.scalb(d, scaleFactor);
1496:            }
1497:
1498:            /**
1499:             * Return {@code f} &times;
1500:             * 2<sup>{@code scaleFactor}</sup> rounded as if performed
1501:             * by a single correctly rounded floating-point multiply to a
1502:             * member of the float value set.  See the Java
1503:             * Language Specification for a discussion of floating-point
1504:             * value sets.  If the exponent of the result is between {@link
1505:             * Float#MIN_EXPONENT} and {@link Float#MAX_EXPONENT}, the
1506:             * answer is calculated exactly.  If the exponent of the result
1507:             * would be larger than {@code Float.MAX_EXPONENT}, an
1508:             * infinity is returned.  Note that if the result is subnormal,
1509:             * precision may be lost; that is, when {@code scalb(x, n)}
1510:             * is subnormal, {@code scalb(scalb(x, n), -n)} may not equal
1511:             * <i>x</i>.  When the result is non-NaN, the result has the same
1512:             * sign as {@code f}.
1513:             *
1514:             * <p>Special cases:
1515:             * <ul>
1516:             * <li> If the first argument is NaN, NaN is returned.
1517:             * <li> If the first argument is infinite, then an infinity of the
1518:             * same sign is returned.
1519:             * <li> If the first argument is zero, then a zero of the same
1520:             * sign is returned.
1521:             * </ul>
1522:             *
1523:             * @param f number to be scaled by a power of two.
1524:             * @param scaleFactor power of 2 used to scale {@code f}
1525:             * @return {@code f} &times; 2<sup>{@code scaleFactor}</sup>
1526:             * @since 1.6
1527:             */
1528:            public static float scalb(float f, int scaleFactor) {
1529:                return sun.misc.FpUtils.scalb(f, scaleFactor);
1530:            }
1531:        }
w___w_w._j__a_v_a2s__.__c_om_ | Contact Us
Copyright 2003 - 08 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.