StrictMath.java revision 0d4ce4227fa818288b8db762b640dfa21e3162f5
1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package java.lang;
19
20/**
21 * Class StrictMath provides basic math constants and operations such as
22 * trigonometric functions, hyperbolic functions, exponential, logarithms, etc.
23 * <p>
24 * In contrast to class {@link Math}, the methods in this class return exactly
25 * the same results on all platforms. Algorithms based on these methods thus
26 * behave the same (e.g. regarding numerical convergence) on all platforms,
27 * complying with the slogan "write once, run everywhere". On the other side,
28 * the implementation of class StrictMath may be less efficient than that of
29 * class Math, as class StrictMath cannot utilize platform specific features
30 * such as an extended precision math co-processors.
31 * <p>
32 * The methods in this class are specified using the "Freely Distributable Math
33 * Library" (fdlibm), version 5.3.
34 * <p>
35 * <a href="http://www.netlib.org/fdlibm/">http://www.netlib.org/fdlibm/</a>
36 */
37public final class StrictMath {
38    /**
39     * The double value closest to e, the base of the natural logarithm.
40     */
41    public static final double E = Math.E;
42
43    /**
44     * The double value closest to pi, the ratio of a circle's circumference to
45     * its diameter.
46     */
47    public static final double PI = Math.PI;
48
49    /**
50     * Prevents this class from being instantiated.
51     */
52    private StrictMath() {
53    }
54
55    /**
56     * Returns the absolute value of the argument.
57     * <p>
58     * Special cases:
59     * <ul>
60     * <li>{@code abs(-0.0) = +0.0}</li>
61     * <li>{@code abs(+infinity) = +infinity}</li>
62     * <li>{@code abs(-infinity) = +infinity}</li>
63     * <li>{@code abs(NaN) = NaN}</li>
64     * </ul>
65     *
66     * @param d
67     *            the value whose absolute value has to be computed.
68     * @return the absolute value of the argument.
69     */
70    public static double abs(double d) {
71        return Math.abs(d);
72    }
73
74    /**
75     * Returns the absolute value of the argument.
76     * <p>
77     * Special cases:
78     * <ul>
79     * <li>{@code abs(-0.0) = +0.0}</li>
80     * <li>{@code abs(+infinity) = +infinity}</li>
81     * <li>{@code abs(-infinity) = +infinity}</li>
82     * <li>{@code abs(NaN) = NaN}</li>
83     * </ul>
84     *
85     * @param f
86     *            the value whose absolute value has to be computed.
87     * @return the argument if it is positive, otherwise the negation of the
88     *         argument.
89     */
90    public static float abs(float f) {
91        return Math.abs(f);
92    }
93
94    /**
95     * Returns the absolute value of the argument.
96     * <p>
97     * If the argument is {@code Integer.MIN_VALUE}, {@code Integer.MIN_VALUE}
98     * is returned.
99     *
100     * @param i
101     *            the value whose absolute value has to be computed.
102     * @return the argument if it is positive, otherwise the negation of the
103     *         argument.
104     */
105    public static int abs(int i) {
106        return Math.abs(i);
107    }
108
109    /**
110     * Returns the absolute value of the argument.
111     * <p>
112     * If the argument is {@code Long.MIN_VALUE}, {@code Long.MIN_VALUE} is
113     * returned.
114     *
115     * @param l
116     *            the value whose absolute value has to be computed.
117     * @return the argument if it is positive, otherwise the negation of the
118     *         argument.
119     */
120    public static long abs(long l) {
121        return Math.abs(l);
122    }
123
124    /**
125     * Returns the closest double approximation of the arc cosine of the
126     * argument within the range {@code [0..pi]}.
127     * <p>
128     * Special cases:
129     * <ul>
130     * <li>{@code acos((anything > 1) = NaN}</li>
131     * <li>{@code acos((anything < -1) = NaN}</li>
132     * <li>{@code acos(NaN) = NaN}</li>
133     * </ul>
134     *
135     * @param d
136     *            the value to compute arc cosine of.
137     * @return the arc cosine of the argument.
138     */
139    public static native double acos(double d);
140
141    /**
142     * Returns the closest double approximation of the arc sine of the argument
143     * within the range {@code [-pi/2..pi/2]}.
144     * <p>
145     * Special cases:
146     * <ul>
147     * <li>{@code asin((anything > 1)) = NaN}</li>
148     * <li>{@code asin((anything < -1)) = NaN}</li>
149     * <li>{@code asin(NaN) = NaN}</li>
150     * </ul>
151     *
152     * @param d
153     *            the value whose arc sine has to be computed.
154     * @return the arc sine of the argument.
155     */
156    public static native double asin(double d);
157
158    /**
159     * Returns the closest double approximation of the arc tangent of the
160     * argument within the range {@code [-pi/2..pi/2]}.
161     * <p>
162     * Special cases:
163     * <ul>
164     * <li>{@code atan(+0.0) = +0.0}</li>
165     * <li>{@code atan(-0.0) = -0.0}</li>
166     * <li>{@code atan(+infinity) = +pi/2}</li>
167     * <li>{@code atan(-infinity) = -pi/2}</li>
168     * <li>{@code atan(NaN) = NaN}</li>
169     * </ul>
170     *
171     * @param d
172     *            the value whose arc tangent has to be computed.
173     * @return the arc tangent of the argument.
174     */
175    public static native double atan(double d);
176
177    /**
178     * Returns the closest double approximation of the arc tangent of
179     * {@code y/x} within the range {@code [-pi..pi]}. This is the angle of the
180     * polar representation of the rectangular coordinates (x,y).
181     * <p>
182     * Special cases:
183     * <ul>
184     * <li>{@code atan2((anything), NaN ) = NaN;}</li>
185     * <li>{@code atan2(NaN , (anything) ) = NaN;}</li>
186     * <li>{@code atan2(+0.0, +(anything but NaN)) = +0.0}</li>
187     * <li>{@code atan2(-0.0, +(anything but NaN)) = -0.0}</li>
188     * <li>{@code atan2(+0.0, -(anything but NaN)) = +pi}</li>
189     * <li>{@code atan2(-0.0, -(anything but NaN)) = -pi}</li>
190     * <li>{@code atan2(+(anything but 0 and NaN), 0) = +pi/2}</li>
191     * <li>{@code atan2(-(anything but 0 and NaN), 0) = -pi/2}</li>
192     * <li>{@code atan2(+(anything but infinity and NaN), +infinity)} {@code =}
193     * {@code +0.0}</li>
194     * <li>{@code atan2(-(anything but infinity and NaN), +infinity)} {@code =}
195     * {@code -0.0}</li>
196     * <li>{@code atan2(+(anything but infinity and NaN), -infinity) = +pi}</li>
197     * <li>{@code atan2(-(anything but infinity and NaN), -infinity) = -pi}</li>
198     * <li>{@code atan2(+infinity, +infinity ) = +pi/4}</li>
199     * <li>{@code atan2(-infinity, +infinity ) = -pi/4}</li>
200     * <li>{@code atan2(+infinity, -infinity ) = +3pi/4}</li>
201     * <li>{@code atan2(-infinity, -infinity ) = -3pi/4}</li>
202     * <li>{@code atan2(+infinity, (anything but,0, NaN, and infinity))}
203     * {@code =} {@code +pi/2}</li>
204     * <li>{@code atan2(-infinity, (anything but,0, NaN, and infinity))}
205     * {@code =} {@code -pi/2}</li>
206     * </ul>
207     *
208     * @param y
209     *            the numerator of the value whose atan has to be computed.
210     * @param x
211     *            the denominator of the value whose atan has to be computed.
212     * @return the arc tangent of {@code y/x}.
213     */
214    public static native double atan2(double y, double x);
215
216    /**
217     * Returns the closest double approximation of the cube root of the
218     * argument.
219     * <p>
220     * Special cases:
221     * <ul>
222     * <li>{@code cbrt(+0.0) = +0.0}</li>
223     * <li>{@code cbrt(-0.0) = -0.0}</li>
224     * <li>{@code cbrt(+infinity) = +infinity}</li>
225     * <li>{@code cbrt(-infinity) = -infinity}</li>
226     * <li>{@code cbrt(NaN) = NaN}</li>
227     * </ul>
228     *
229     * @param d
230     *            the value whose cube root has to be computed.
231     * @return the cube root of the argument.
232     */
233    public static native double cbrt(double d);
234
235    /**
236     * Returns the double conversion of the most negative (closest to negative
237     * infinity) integer value which is greater than the argument.
238     * <p>
239     * Special cases:
240     * <ul>
241     * <li>{@code ceil(+0.0) = +0.0}</li>
242     * <li>{@code ceil(-0.0) = -0.0}</li>
243     * <li>{@code ceil((anything in range (-1,0)) = -0.0}</li>
244     * <li>{@code ceil(+infinity) = +infinity}</li>
245     * <li>{@code ceil(-infinity) = -infinity}</li>
246     * <li>{@code ceil(NaN) = NaN}</li>
247     * </ul>
248     *
249     * @param d
250     *            the value whose closest integer value has to be computed.
251     * @return the ceiling of the argument.
252     */
253    public static native double ceil(double d);
254
255
256    /**
257     * Returns the closest double approximation of the hyperbolic cosine of the
258     * argument.
259     * <p>
260     * Special cases:
261     * <ul>
262     * <li>{@code cosh(+infinity) = +infinity}</li>
263     * <li>{@code cosh(-infinity) = +infinity}</li>
264     * <li>{@code cosh(NaN) = NaN}</li>
265     * </ul>
266     *
267     * @param d
268     *            the value whose hyperbolic cosine has to be computed.
269     * @return the hyperbolic cosine of the argument.
270     */
271    public static native double cosh(double d);
272
273    /**
274     * Returns the closest double approximation of the cosine of the argument.
275     * <p>
276     * Special cases:
277     * <ul>
278     * <li>{@code cos(+infinity) = NaN}</li>
279     * <li>{@code cos(-infinity) = NaN}</li>
280     * <li>{@code cos(NaN) = NaN}</li>
281     * </ul>
282     *
283     * @param d
284     *            the angle whose cosine has to be computed, in radians.
285     * @return the cosine of the argument.
286     */
287    public static native double cos(double d);
288
289    /**
290     * Returns the closest double approximation of the raising "e" to the power
291     * of the argument.
292     * <p>
293     * Special cases:
294     * <ul>
295     * <li>{@code exp(+infinity) = +infinity}</li>
296     * <li>{@code exp(-infinity) = +0.0}</li>
297     * <li>{@code exp(NaN) = NaN}</li>
298     * </ul>
299     *
300     * @param d
301     *            the value whose exponential has to be computed.
302     * @return the exponential of the argument.
303     */
304    public static native double exp(double d);
305
306    /**
307     * Returns the closest double approximation of <i>{@code e}</i><sup>
308     * {@code d}</sup>{@code - 1}. If the argument is very close to 0, it is
309     * much more accurate to use {@code expm1(d)+1} than {@code exp(d)} (due to
310     * cancellation of significant digits).
311     * <p>
312     * Special cases:
313     * <ul>
314     * <li>{@code expm1(+0.0) = +0.0}</li>
315     * <li>{@code expm1(-0.0) = -0.0}</li>
316     * <li>{@code expm1(+infinity) = +infinity}</li>
317     * <li>{@code expm1(-infinity) = -1.0}</li>
318     * <li>{@code expm1(NaN) = NaN}</li>
319     * </ul>
320     *
321     * @param d
322     *            the value to compute the <i>{@code e}</i><sup>{@code d}</sup>
323     *            {@code - 1} of.
324     * @return the <i>{@code e}</i><sup>{@code d}</sup>{@code - 1} value
325     *         of the argument.
326     */
327    public static native double expm1(double d);
328
329    /**
330     * Returns the double conversion of the most positive (closest to
331     * positive infinity) integer value which is less than the argument.
332     * <p>
333     * Special cases:
334     * <ul>
335     * <li>{@code floor(+0.0) = +0.0}</li>
336     * <li>{@code floor(-0.0) = -0.0}</li>
337     * <li>{@code floor(+infinity) = +infinity}</li>
338     * <li>{@code floor(-infinity) = -infinity}</li>
339     * <li>{@code floor(NaN) = NaN}</li>
340     * </ul>
341     *
342     * @param d the value whose closest integer value has to be computed.
343     * @return the floor of the argument.
344     */
345    public static native double floor(double d);
346
347    /**
348     * Returns {@code sqrt(}<i>{@code x}</i><sup>{@code 2}</sup>{@code +}
349     * <i> {@code y}</i><sup>{@code 2}</sup>{@code )}. The final result is
350     * without medium underflow or overflow.
351     * <p>
352     * Special cases:
353     * <ul>
354     * <li>{@code hypot(+infinity, (anything including NaN)) = +infinity}</li>
355     * <li>{@code hypot(-infinity, (anything including NaN)) = +infinity}</li>
356     * <li>{@code hypot((anything including NaN), +infinity) = +infinity}</li>
357     * <li>{@code hypot((anything including NaN), -infinity) = +infinity}</li>
358     * <li>{@code hypot(NaN, NaN) = NaN}</li>
359     * </ul>
360     *
361     * @param x
362     *            a double number.
363     * @param y
364     *            a double number.
365     * @return the {@code sqrt(}<i>{@code x}</i><sup>{@code 2}</sup>{@code +}
366     *         <i> {@code y}</i><sup>{@code 2}</sup>{@code )} value of the
367     *         arguments.
368     */
369    public static native double hypot(double x, double y);
370
371    /**
372     * Returns the remainder of dividing {@code x} by {@code y} using the IEEE
373     * 754 rules. The result is {@code x-round(x/p)*p} where {@code round(x/p)}
374     * is the nearest integer (rounded to even), but without numerical
375     * cancellation problems.
376     * <p>
377     * Special cases:
378     * <ul>
379     * <li>{@code IEEEremainder((anything), 0) = NaN}</li>
380     * <li>{@code IEEEremainder(+infinity, (anything)) = NaN}</li>
381     * <li>{@code IEEEremainder(-infinity, (anything)) = NaN}</li>
382     * <li>{@code IEEEremainder(NaN, (anything)) = NaN}</li>
383     * <li>{@code IEEEremainder((anything), NaN) = NaN}</li>
384     * <li>{@code IEEEremainder(x, +infinity) = x } where x is anything but
385     * +/-infinity</li>
386     * <li>{@code IEEEremainder(x, -infinity) = x } where x is anything but
387     * +/-infinity</li>
388     * </ul>
389     *
390     * @param x
391     *            the numerator of the operation.
392     * @param y
393     *            the denominator of the operation.
394     * @return the IEEE754 floating point reminder of of {@code x/y}.
395     */
396    public static native double IEEEremainder(double x, double y);
397
398    /**
399     * Returns the closest double approximation of the natural logarithm of the
400     * argument.
401     * <p>
402     * Special cases:
403     * <ul>
404     * <li>{@code log(+0.0) = -infinity}</li>
405     * <li>{@code log(-0.0) = -infinity}</li>
406     * <li>{@code log((anything < 0) = NaN}</li>
407     * <li>{@code log(+infinity) = +infinity}</li>
408     * <li>{@code log(-infinity) = NaN}</li>
409     * <li>{@code log(NaN) = NaN}</li>
410     * </ul>
411     *
412     * @param d
413     *            the value whose log has to be computed.
414     * @return the natural logarithm of the argument.
415     */
416    public static native double log(double d);
417
418    /**
419     * Returns the closest double approximation of the base 10 logarithm of the
420     * argument.
421     * <p>
422     * Special cases:
423     * <ul>
424     * <li>{@code log10(+0.0) = -infinity}</li>
425     * <li>{@code log10(-0.0) = -infinity}</li>
426     * <li>{@code log10((anything < 0) = NaN}</li>
427     * <li>{@code log10(+infinity) = +infinity}</li>
428     * <li>{@code log10(-infinity) = NaN}</li>
429     * <li>{@code log10(NaN) = NaN}</li>
430     * </ul>
431     *
432     * @param d
433     *            the value whose base 10 log has to be computed.
434     * @return the natural logarithm of the argument.
435     */
436    public static native double log10(double d);
437
438    /**
439     * Returns the closest double approximation of the natural logarithm of the
440     * sum of the argument and 1. If the argument is very close to 0, it is much
441     * more accurate to use {@code log1p(d)} than {@code log(1.0+d)} (due to
442     * numerical cancellation).
443     * <p>
444     * Special cases:
445     * <ul>
446     * <li>{@code log1p(+0.0) = +0.0}</li>
447     * <li>{@code log1p(-0.0) = -0.0}</li>
448     * <li>{@code log1p((anything < 1)) = NaN}</li>
449     * <li>{@code log1p(-1.0) = -infinity}</li>
450     * <li>{@code log1p(+infinity) = +infinity}</li>
451     * <li>{@code log1p(-infinity) = NaN}</li>
452     * <li>{@code log1p(NaN) = NaN}</li>
453     * </ul>
454     *
455     * @param d
456     *            the value to compute the {@code ln(1+d)} of.
457     * @return the natural logarithm of the sum of the argument and 1.
458     */
459    public static native double log1p(double d);
460
461    /**
462     * Returns the most positive (closest to positive infinity) of the two
463     * arguments.
464     * <p>
465     * Special cases:
466     * <ul>
467     * <li>{@code max(NaN, (anything)) = NaN}</li>
468     * <li>{@code max((anything), NaN) = NaN}</li>
469     * <li>{@code max(+0.0, -0.0) = +0.0}</li>
470     * <li>{@code max(-0.0, +0.0) = +0.0}</li>
471     * </ul>
472     *
473     * @param d1
474     *            the first argument.
475     * @param d2
476     *            the second argument.
477     * @return the larger of {@code d1} and {@code d2}.
478     */
479    public static double max(double d1, double d2) {
480        if (d1 > d2)
481            return d1;
482        if (d1 < d2)
483            return d2;
484        /* if either arg is NaN, return NaN */
485        if (d1 != d2)
486            return Double.NaN;
487        /* max( +0.0,-0.0) == +0.0 */
488        if (d1 == 0.0
489                && ((Double.doubleToLongBits(d1) & Double.doubleToLongBits(d2)) & 0x8000000000000000L) == 0)
490            return 0.0;
491        return d1;
492    }
493
494    /**
495     * Returns the most positive (closest to positive infinity) of the two
496     * arguments.
497     * <p>
498     * Special cases:
499     * <ul>
500     * <li>{@code max(NaN, (anything)) = NaN}</li>
501     * <li>{@code max((anything), NaN) = NaN}</li>
502     * <li>{@code max(+0.0, -0.0) = +0.0}</li>
503     * <li>{@code max(-0.0, +0.0) = +0.0}</li>
504     * </ul>
505     *
506     * @param f1
507     *            the first argument.
508     * @param f2
509     *            the second argument.
510     * @return the larger of {@code f1} and {@code f2}.
511     */
512    public static float max(float f1, float f2) {
513        if (f1 > f2)
514            return f1;
515        if (f1 < f2)
516            return f2;
517        /* if either arg is NaN, return NaN */
518        if (f1 != f2)
519            return Float.NaN;
520        /* max( +0.0,-0.0) == +0.0 */
521        if (f1 == 0.0f
522                && ((Float.floatToIntBits(f1) & Float.floatToIntBits(f2)) & 0x80000000) == 0)
523            return 0.0f;
524        return f1;
525    }
526
527    /**
528     * Returns the most positive (closest to positive infinity) of the two
529     * arguments.
530     *
531     * @param i1
532     *            the first argument.
533     * @param i2
534     *            the second argument.
535     * @return the larger of {@code i1} and {@code i2}.
536     */
537    public static int max(int i1, int i2) {
538        return Math.max(i1, i2);
539    }
540
541    /**
542     * Returns the most positive (closest to positive infinity) of the two
543     * arguments.
544     *
545     * @param l1
546     *            the first argument.
547     * @param l2
548     *            the second argument.
549     * @return the larger of {@code l1} and {@code l2}.
550     */
551    public static long max(long l1, long l2) {
552        return Math.max(l1, l2);
553    }
554
555    /**
556     * Returns the most negative (closest to negative infinity) of the two
557     * arguments.
558     * <p>
559     * Special cases:
560     * <ul>
561     * <li>{@code min(NaN, (anything)) = NaN}</li>
562     * <li>{@code min((anything), NaN) = NaN}</li>
563     * <li>{@code min(+0.0, -0.0) = -0.0}</li>
564     * <li>{@code min(-0.0, +0.0) = -0.0}</li>
565     * </ul>
566     *
567     * @param d1
568     *            the first argument.
569     * @param d2
570     *            the second argument.
571     * @return the smaller of {@code d1} and {@code d2}.
572     */
573    public static double min(double d1, double d2) {
574        if (d1 > d2)
575            return d2;
576        if (d1 < d2)
577            return d1;
578        /* if either arg is NaN, return NaN */
579        if (d1 != d2)
580            return Double.NaN;
581        /* min( +0.0,-0.0) == -0.0 */
582        if (d1 == 0.0
583                && ((Double.doubleToLongBits(d1) | Double.doubleToLongBits(d2)) & 0x8000000000000000l) != 0)
584            return 0.0 * (-1.0);
585        return d1;
586    }
587
588    /**
589     * Returns the most negative (closest to negative infinity) of the two
590     * arguments.
591     * <p>
592     * Special cases:
593     * <ul>
594     * <li>{@code min(NaN, (anything)) = NaN}</li>
595     * <li>{@code min((anything), NaN) = NaN}</li>
596     * <li>{@code min(+0.0, -0.0) = -0.0}</li>
597     * <li>{@code min(-0.0, +0.0) = -0.0}</li>
598     * </ul>
599     *
600     * @param f1
601     *            the first argument.
602     * @param f2
603     *            the second argument.
604     * @return the smaller of {@code f1} and {@code f2}.
605     */
606    public static float min(float f1, float f2) {
607        if (f1 > f2)
608            return f2;
609        if (f1 < f2)
610            return f1;
611        /* if either arg is NaN, return NaN */
612        if (f1 != f2)
613            return Float.NaN;
614        /* min( +0.0,-0.0) == -0.0 */
615        if (f1 == 0.0f
616                && ((Float.floatToIntBits(f1) | Float.floatToIntBits(f2)) & 0x80000000) != 0)
617            return 0.0f * (-1.0f);
618        return f1;
619    }
620
621    /**
622     * Returns the most negative (closest to negative infinity) of the two
623     * arguments.
624     *
625     * @param i1
626     *            the first argument.
627     * @param i2
628     *            the second argument.
629     * @return the smaller of {@code i1} and {@code i2}.
630     */
631    public static int min(int i1, int i2) {
632        return Math.min(i1, i2);
633    }
634
635    /**
636     * Returns the most negative (closest to negative infinity) of the two
637     * arguments.
638     *
639     * @param l1
640     *            the first argument.
641     * @param l2
642     *            the second argument.
643     * @return the smaller of {@code l1} and {@code l2}.
644     */
645    public static long min(long l1, long l2) {
646        return Math.min(l1, l2);
647    }
648
649    /**
650     * Returns the closest double approximation of the result of raising
651     * {@code x} to the power of {@code y}.
652     * <p>
653     * Special cases:
654     * <ul>
655     * <li>{@code pow((anything), +0.0) = 1.0}</li>
656     * <li>{@code pow((anything), -0.0) = 1.0}</li>
657     * <li>{@code pow(x, 1.0) = x}</li>
658     * <li>{@code pow((anything), NaN) = NaN}</li>
659     * <li>{@code pow(NaN, (anything except 0)) = NaN}</li>
660     * <li>{@code pow(+/-(|x| > 1), +infinity) = +infinity}</li>
661     * <li>{@code pow(+/-(|x| > 1), -infinity) = +0.0}</li>
662     * <li>{@code pow(+/-(|x| < 1), +infinity) = +0.0}</li>
663     * <li>{@code pow(+/-(|x| < 1), -infinity) = +infinity}</li>
664     * <li>{@code pow(+/-1.0 , +infinity) = NaN}</li>
665     * <li>{@code pow(+/-1.0 , -infinity) = NaN}</li>
666     * <li>{@code pow(+0.0, (+anything except 0, NaN)) = +0.0}</li>
667     * <li>{@code pow(-0.0, (+anything except 0, NaN, odd integer)) = +0.0}</li>
668     * <li>{@code pow(+0.0, (-anything except 0, NaN)) = +infinity}</li>
669     * <li>{@code pow(-0.0, (-anything except 0, NAN, odd integer))} {@code =}
670     * {@code +infinity}</li>
671     * <li>{@code pow(-0.0, (odd integer)) = -pow( +0 , (odd integer) )}</li>
672     * <li>{@code pow(+infinity, (+anything except 0, NaN)) = +infinity}</li>
673     * <li>{@code pow(+infinity, (-anything except 0, NaN)) = +0.0}</li>
674     * <li>{@code pow(-infinity, (anything)) = -pow(0, (-anything))}</li>
675     * <li>{@code pow((-anything), (integer))} {@code =}
676     * {@code pow(-1,(integer))*pow(+anything,integer)}</li>
677     * <li>{@code pow((-anything except 0 and infinity), (non-integer))}
678     * {@code =} {@code NAN}</li>
679     * </ul>
680     *
681     * @param x
682     *            the base of the operation.
683     * @param y
684     *            the exponent of the operation.
685     * @return {@code x} to the power of {@code y}.
686     */
687    public static native double pow(double x, double y);
688
689    /**
690     * Returns a pseudo-random number between 0.0 (inclusive) and 1.0
691     * (exclusive).
692     *
693     * @return a pseudo-random number.
694     */
695    public static double random() {
696        return Math.random();
697    }
698
699    /**
700     * Returns the double conversion of the result of rounding the argument to
701     * an integer. Tie breaks are rounded towards even.
702     * <p>
703     * Special cases:
704     * <ul>
705     * <li>{@code rint(+0.0) = +0.0}</li>
706     * <li>{@code rint(-0.0) = -0.0}</li>
707     * <li>{@code rint(+infinity) = +infinity}</li>
708     * <li>{@code rint(-infinity) = -infinity}</li>
709     * <li>{@code rint(NaN) = NaN}</li>
710     * </ul>
711     *
712     * @param d
713     *            the value to be rounded.
714     * @return the closest integer to the argument (as a double).
715     */
716    public static native double rint(double d);
717
718    /**
719     * Returns the result of rounding the argument to an integer. The result is
720     * equivalent to {@code (long) Math.floor(d+0.5)}.
721     * <p>
722     * Special cases:
723     * <ul>
724     * <li>{@code round(+0.0) = +0.0}</li>
725     * <li>{@code round(-0.0) = +0.0}</li>
726     * <li>{@code round((anything > Long.MAX_VALUE) = Long.MAX_VALUE}</li>
727     * <li>{@code round((anything < Long.MIN_VALUE) = Long.MIN_VALUE}</li>
728     * <li>{@code round(+infinity) = Long.MAX_VALUE}</li>
729     * <li>{@code round(-infinity) = Long.MIN_VALUE}</li>
730     * <li>{@code round(NaN) = +0.0}</li>
731     * </ul>
732     *
733     * @param d
734     *            the value to be rounded.
735     * @return the closest integer to the argument.
736     */
737    public static long round(double d) {
738        return Math.round(d);
739    }
740
741    /**
742     * Returns the result of rounding the argument to an integer. The result is
743     * equivalent to {@code (int) Math.floor(f+0.5)}.
744     * <p>
745     * Special cases:
746     * <ul>
747     * <li>{@code round(+0.0) = +0.0}</li>
748     * <li>{@code round(-0.0) = +0.0}</li>
749     * <li>{@code round((anything > Integer.MAX_VALUE) = Integer.MAX_VALUE}</li>
750     * <li>{@code round((anything < Integer.MIN_VALUE) = Integer.MIN_VALUE}</li>
751     * <li>{@code round(+infinity) = Integer.MAX_VALUE}</li>
752     * <li>{@code round(-infinity) = Integer.MIN_VALUE}</li>
753     * <li>{@code round(NaN) = +0.0}</li>
754     * </ul>
755     *
756     * @param f
757     *            the value to be rounded.
758     * @return the closest integer to the argument.
759     */
760    public static int round(float f) {
761        return Math.round(f);
762    }
763
764    /**
765     * Returns the signum function of the argument. If the argument is less than
766     * zero, it returns -1.0. If the argument is greater than zero, 1.0 is
767     * returned. If the argument is either positive or negative zero, the
768     * argument is returned as result.
769     * <p>
770     * Special cases:
771     * <ul>
772     * <li>{@code signum(+0.0) = +0.0}</li>
773     * <li>{@code signum(-0.0) = -0.0}</li>
774     * <li>{@code signum(+infinity) = +1.0}</li>
775     * <li>{@code signum(-infinity) = -1.0}</li>
776     * <li>{@code signum(NaN) = NaN}</li>
777     * </ul>
778     *
779     * @param d
780     *            the value whose signum has to be computed.
781     * @return the value of the signum function.
782     */
783    public static double signum(double d){
784        return Math.signum(d);
785    }
786
787    /**
788     * Returns the signum function of the argument. If the argument is less than
789     * zero, it returns -1.0. If the argument is greater than zero, 1.0 is
790     * returned. If the argument is either positive or negative zero, the
791     * argument is returned as result.
792     * <p>
793     * Special cases:
794     * <ul>
795     * <li>{@code signum(+0.0) = +0.0}</li>
796     * <li>{@code signum(-0.0) = -0.0}</li>
797     * <li>{@code signum(+infinity) = +1.0}</li>
798     * <li>{@code signum(-infinity) = -1.0}</li>
799     * <li>{@code signum(NaN) = NaN}</li>
800     * </ul>
801     *
802     * @param f
803     *            the value whose signum has to be computed.
804     * @return the value of the signum function.
805     */
806    public static float signum(float f){
807        return Math.signum(f);
808    }
809
810    /**
811     * Returns the closest double approximation of the hyperbolic sine of the
812     * argument.
813     * <p>
814     * Special cases:
815     * <ul>
816     * <li>{@code sinh(+0.0) = +0.0}</li>
817     * <li>{@code sinh(-0.0) = -0.0}</li>
818     * <li>{@code sinh(+infinity) = +infinity}</li>
819     * <li>{@code sinh(-infinity) = -infinity}</li>
820     * <li>{@code sinh(NaN) = NaN}</li>
821     * </ul>
822     *
823     * @param d
824     *            the value whose hyperbolic sine has to be computed.
825     * @return the hyperbolic sine of the argument.
826     */
827    public static native double sinh(double d);
828
829    /**
830     * Returns the closest double approximation of the sine of the argument.
831     * <p>
832     * Special cases:
833     * <ul>
834     * <li>{@code sin(+0.0) = +0.0}</li>
835     * <li>{@code sin(-0.0) = -0.0}</li>
836     * <li>{@code sin(+infinity) = NaN}</li>
837     * <li>{@code sin(-infinity) = NaN}</li>
838     * <li>{@code sin(NaN) = NaN}</li>
839     * </ul>
840     *
841     * @param d
842     *            the angle whose sin has to be computed, in radians.
843     * @return the sine of the argument.
844     */
845    public static native double sin(double d);
846
847    /**
848     * Returns the closest double approximation of the square root of the
849     * argument.
850     * <p>
851     * Special cases:
852     * <ul>
853     * <li>{@code sqrt(+0.0) = +0.0}</li>
854     * <li>{@code sqrt(-0.0) = -0.0}</li>
855     * <li>{@code sqrt( (anything < 0) ) = NaN}</li>
856     * <li>{@code sqrt(+infinity) = +infinity}</li>
857     * <li>{@code sqrt(NaN) = NaN}</li>
858     * </ul>
859     *
860     * @param d
861     *            the value whose square root has to be computed.
862     * @return the square root of the argument.
863     */
864    public static native double sqrt(double d);
865
866    /**
867     * Returns the closest double approximation of the tangent of the argument.
868     * <p>
869     * Special cases:
870     * <ul>
871     * <li>{@code tan(+0.0) = +0.0}</li>
872     * <li>{@code tan(-0.0) = -0.0}</li>
873     * <li>{@code tan(+infinity) = NaN}</li>
874     * <li>{@code tan(-infinity) = NaN}</li>
875     * <li>{@code tan(NaN) = NaN}</li>
876     * </ul>
877     *
878     * @param d
879     *            the angle whose tangent has to be computed, in radians.
880     * @return the tangent of the argument.
881     */
882    public static native double tan(double d);
883
884    /**
885     * Returns the closest double approximation of the hyperbolic tangent of the
886     * argument. The absolute value is always less than 1.
887     * <p>
888     * Special cases:
889     * <ul>
890     * <li>{@code tanh(+0.0) = +0.0}</li>
891     * <li>{@code tanh(-0.0) = -0.0}</li>
892     * <li>{@code tanh(+infinity) = +1.0}</li>
893     * <li>{@code tanh(-infinity) = -1.0}</li>
894     * <li>{@code tanh(NaN) = NaN}</li>
895     * </ul>
896     *
897     * @param d
898     *            the value whose hyperbolic tangent has to be computed.
899     * @return the hyperbolic tangent of the argument
900     */
901    public static native double tanh(double d);
902
903    /**
904     * Returns the measure in degrees of the supplied radian angle. The result
905     * is {@code angrad * 180 / pi}.
906     * <p>
907     * Special cases:
908     * <ul>
909     * <li>{@code toDegrees(+0.0) = +0.0}</li>
910     * <li>{@code toDegrees(-0.0) = -0.0}</li>
911     * <li>{@code toDegrees(+infinity) = +infinity}</li>
912     * <li>{@code toDegrees(-infinity) = -infinity}</li>
913     * <li>{@code toDegrees(NaN) = NaN}</li>
914     * </ul>
915     *
916     * @param angrad
917     *            an angle in radians.
918     * @return the degree measure of the angle.
919     */
920    public static double toDegrees(double angrad) {
921        return Math.toDegrees(angrad);
922    }
923
924    /**
925     * Returns the measure in radians of the supplied degree angle. The result
926     * is {@code angdeg / 180 * pi}.
927     * <p>
928     * Special cases:
929     * <ul>
930     * <li>{@code toRadians(+0.0) = +0.0}</li>
931     * <li>{@code toRadians(-0.0) = -0.0}</li>
932     * <li>{@code toRadians(+infinity) = +infinity}</li>
933     * <li>{@code toRadians(-infinity) = -infinity}</li>
934     * <li>{@code toRadians(NaN) = NaN}</li>
935     * </ul>
936     *
937     * @param angdeg
938     *            an angle in degrees.
939     * @return the radian measure of the angle.
940     */
941    public static double toRadians(double angdeg) {
942        return Math.toRadians(angdeg);
943    }
944
945    /**
946     * Returns the argument's ulp (unit in the last place). The size of a ulp of
947     * a double value is the positive distance between this value and the double
948     * value next larger in magnitude. For non-NaN {@code x},
949     * {@code ulp(-x) == ulp(x)}.
950     * <p>
951     * Special cases:
952     * <ul>
953     * <li>{@code ulp(+0.0) = Double.MIN_VALUE}</li>
954     * <li>{@code ulp(-0.0) = Double.MIN_VALUE}</li>
955     * <li>{@code ulp(+infinity) = infinity}</li>
956     * <li>{@code ulp(-infinity) = infinity}</li>
957     * <li>{@code ulp(NaN) = NaN}</li>
958     * </ul>
959     *
960     * @param d
961     *            the floating-point value to compute ulp of.
962     * @return the size of a ulp of the argument.
963     */
964    public static double ulp(double d) {
965        // special cases
966        if (Double.isInfinite(d)) {
967            return Double.POSITIVE_INFINITY;
968        } else if (d == Double.MAX_VALUE || d == -Double.MAX_VALUE) {
969            return pow(2, 971);
970        }
971        d = Math.abs(d);
972        return nextafter(d, Double.MAX_VALUE) - d;
973    }
974
975    /**
976     * Returns the argument's ulp (unit in the last place). The size of a ulp of
977     * a float value is the positive distance between this value and the float
978     * value next larger in magnitude. For non-NaN {@code x},
979     * {@code ulp(-x) == ulp(x)}.
980     * <p>
981     * Special cases:
982     * <ul>
983     * <li>{@code ulp(+0.0) = Float.MIN_VALUE}</li>
984     * <li>{@code ulp(-0.0) = Float.MIN_VALUE}</li>
985     * <li>{@code ulp(+infinity) = infinity}</li>
986     * <li>{@code ulp(-infinity) = infinity}</li>
987     * <li>{@code ulp(NaN) = NaN}</li>
988     * </ul>
989     *
990     * @param f
991     *            the floating-point value to compute ulp of.
992     * @return the size of a ulp of the argument.
993     */
994    public static float ulp(float f) {
995        // special cases
996        if (Float.isNaN(f)) {
997            return Float.NaN;
998        } else if (Float.isInfinite(f)) {
999            return Float.POSITIVE_INFINITY;
1000        } else if (f == Float.MAX_VALUE || f == -Float.MAX_VALUE) {
1001            return (float) pow(2, 104);
1002        }
1003        f = Math.abs(f);
1004        return nextafterf(f, Float.MAX_VALUE) - f;
1005    }
1006
1007    private native static double nextafter(double x, double y);
1008
1009    private native static float nextafterf(float x, float y);
1010
1011    /**
1012     * Returns a double with the given magnitude and the sign of {@code sign}.
1013     * If {@code sign} is NaN, the sign of the result is positive.
1014     * @since 1.6
1015     */
1016    public static double copySign(double magnitude, double sign) {
1017        // We manually inline Double.isNaN here because the JIT can't do it yet.
1018        // With Double.isNaN: 236.3ns
1019        // With manual inline: 141.2ns
1020        // With no check (i.e. Math's behavior): 110.0ns
1021        // (Tested on a Nexus One.)
1022        long magnitudeBits = Double.doubleToRawLongBits(magnitude);
1023        long signBits = Double.doubleToRawLongBits((sign != sign) ? 1.0 : sign);
1024        magnitudeBits = (magnitudeBits & ~Double.SIGN_MASK) | (signBits & Double.SIGN_MASK);
1025        return Double.longBitsToDouble(magnitudeBits);
1026    }
1027
1028    /**
1029     * Returns a float with the given magnitude and the sign of {@code sign}.
1030     * If {@code sign} is NaN, the sign of the result is positive.
1031     * @since 1.6
1032     */
1033    public static float copySign(float magnitude, float sign) {
1034        // We manually inline Float.isNaN here because the JIT can't do it yet.
1035        // With Float.isNaN: 214.7ns
1036        // With manual inline: 112.3ns
1037        // With no check (i.e. Math's behavior): 93.1ns
1038        // (Tested on a Nexus One.)
1039        int magnitudeBits = Float.floatToRawIntBits(magnitude);
1040        int signBits = Float.floatToRawIntBits((sign != sign) ? 1.0f : sign);
1041        magnitudeBits = (magnitudeBits & ~Float.SIGN_MASK) | (signBits & Float.SIGN_MASK);
1042        return Float.intBitsToFloat(magnitudeBits);
1043    }
1044
1045    /**
1046     * Returns the exponent of float {@code f}.
1047     * @since 1.6
1048     */
1049    public static int getExponent(float f) {
1050        return Math.getExponent(f);
1051    }
1052
1053    /**
1054     * Returns the exponent of double {@code d}.
1055     * @since 1.6
1056     */
1057    public static int getExponent(double d){
1058        return Math.getExponent(d);
1059    }
1060
1061    /**
1062     * Returns the next double after {@code start} in the given {@code direction}.
1063     * @since 1.6
1064     */
1065    public static double nextAfter(double start, double direction) {
1066        if (start == 0 && direction == 0) {
1067            return direction;
1068        }
1069        return nextafter(start, direction);
1070    }
1071
1072    /**
1073     * Returns the next float after {@code start} in the given {@code direction}.
1074     * @since 1.6
1075     */
1076    public static float nextAfter(float start, double direction) {
1077        return Math.nextAfter(start, direction);
1078    }
1079
1080    /**
1081     * Returns the next double larger than {@code d}.
1082     * @since 1.6
1083     */
1084    public static double nextUp(double d) {
1085        return Math.nextUp(d);
1086    }
1087
1088    /**
1089     * Returns the next float larger than {@code f}.
1090     * @since 1.6
1091     */
1092    public static float nextUp(float f) {
1093        return Math.nextUp(f);
1094    }
1095
1096    /**
1097     * Returns {@code d} * 2^{@code scaleFactor}. The result may be rounded.
1098     * @since 1.6
1099     */
1100    public static double scalb(double d, int scaleFactor) {
1101        if (Double.isNaN(d) || Double.isInfinite(d) || d == 0) {
1102            return d;
1103        }
1104        // change double to long for calculation
1105        long bits = Double.doubleToLongBits(d);
1106        // the sign of the results must be the same of given d
1107        long sign = bits & Double.SIGN_MASK;
1108        // calculates the factor of the result
1109        long factor = (int) ((bits & Double.EXPONENT_MASK) >> Double.MANTISSA_BITS)
1110                - Double.EXPONENT_BIAS + scaleFactor;
1111
1112        // calculates the factor of sub-normal values
1113        int subNormalFactor = Long.numberOfLeadingZeros(bits & ~Double.SIGN_MASK)
1114                - Double.EXPONENT_BITS;
1115        if (subNormalFactor < 0) {
1116            // not sub-normal values
1117            subNormalFactor = 0;
1118        }
1119        if (Math.abs(d) < Double.MIN_NORMAL) {
1120            factor = factor - subNormalFactor;
1121        }
1122        if (factor > Double.MAX_EXPONENT) {
1123            return (d > 0 ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY);
1124        }
1125
1126        long result;
1127        // if result is a sub-normal
1128        if (factor < -Double.EXPONENT_BIAS) {
1129            // the number of digits that shifts
1130            long digits = factor + Double.EXPONENT_BIAS + subNormalFactor;
1131            if (Math.abs(d) < Double.MIN_NORMAL) {
1132                // origin d is already sub-normal
1133                result = shiftLongBits(bits & Double.MANTISSA_MASK, digits);
1134            } else {
1135                // origin d is not sub-normal, change mantissa to sub-normal
1136                result = shiftLongBits(bits & Double.MANTISSA_MASK | 0x0010000000000000L, digits - 1);
1137            }
1138        } else {
1139            if (Math.abs(d) >= Double.MIN_NORMAL) {
1140                // common situation
1141                result = ((factor + Double.EXPONENT_BIAS) << Double.MANTISSA_BITS)
1142                        | (bits & Double.MANTISSA_MASK);
1143            } else {
1144                // origin d is sub-normal, change mantissa to normal style
1145                result = ((factor + Double.EXPONENT_BIAS) << Double.MANTISSA_BITS)
1146                        | ((bits << (subNormalFactor + 1)) & Double.MANTISSA_MASK);
1147            }
1148        }
1149        return Double.longBitsToDouble(result | sign);
1150    }
1151
1152    /**
1153     * Returns {@code d} * 2^{@code scaleFactor}. The result may be rounded.
1154     * @since 1.6
1155     */
1156    public static float scalb(float d, int scaleFactor) {
1157        if (Float.isNaN(d) || Float.isInfinite(d) || d == 0) {
1158            return d;
1159        }
1160        int bits = Float.floatToIntBits(d);
1161        int sign = bits & Float.SIGN_MASK;
1162        int factor = ((bits & Float.EXPONENT_MASK) >> Float.MANTISSA_BITS)
1163                - Float.EXPONENT_BIAS + scaleFactor;
1164        // calculates the factor of sub-normal values
1165        int subNormalFactor = Integer.numberOfLeadingZeros(bits & ~Float.SIGN_MASK)
1166                - Float.EXPONENT_BITS;
1167        if (subNormalFactor < 0) {
1168            // not sub-normal values
1169            subNormalFactor = 0;
1170        }
1171        if (Math.abs(d) < Float.MIN_NORMAL) {
1172            factor = factor - subNormalFactor;
1173        }
1174        if (factor > Float.MAX_EXPONENT) {
1175            return (d > 0 ? Float.POSITIVE_INFINITY : Float.NEGATIVE_INFINITY);
1176        }
1177
1178        int result;
1179        // if result is a sub-normal
1180        if (factor < -Float.EXPONENT_BIAS) {
1181            // the number of digits that shifts
1182            int digits = factor + Float.EXPONENT_BIAS + subNormalFactor;
1183            if (Math.abs(d) < Float.MIN_NORMAL) {
1184                // origin d is already sub-normal
1185                result = shiftIntBits(bits & Float.MANTISSA_MASK, digits);
1186            } else {
1187                // origin d is not sub-normal, change mantissa to sub-normal
1188                result = shiftIntBits(bits & Float.MANTISSA_MASK | 0x00800000, digits - 1);
1189            }
1190        } else {
1191            if (Math.abs(d) >= Float.MIN_NORMAL) {
1192                // common situation
1193                result = ((factor + Float.EXPONENT_BIAS) << Float.MANTISSA_BITS)
1194                        | (bits & Float.MANTISSA_MASK);
1195            } else {
1196                // origin d is sub-normal, change mantissa to normal style
1197                result = ((factor + Float.EXPONENT_BIAS) << Float.MANTISSA_BITS)
1198                        | ((bits << (subNormalFactor + 1)) & Float.MANTISSA_MASK);
1199            }
1200        }
1201        return Float.intBitsToFloat(result | sign);
1202    }
1203
1204    // Shifts integer bits as float, if the digits is positive, left-shift; if
1205    // not, shift to right and calculate its carry.
1206    private static int shiftIntBits(int bits, int digits) {
1207        if (digits > 0) {
1208            return bits << digits;
1209        }
1210        // change it to positive
1211        int absDigits = -digits;
1212        if (Integer.numberOfLeadingZeros(bits & ~Float.SIGN_MASK) <= (32 - absDigits)) {
1213            // some bits will remain after shifting, calculates its carry
1214            if ((((bits >> (absDigits - 1)) & 0x1) == 0)
1215                    || Integer.numberOfTrailingZeros(bits) == (absDigits - 1)) {
1216                return bits >> absDigits;
1217            }
1218            return ((bits >> absDigits) + 1);
1219        }
1220        return 0;
1221    }
1222
1223    // Shifts long bits as double, if the digits is positive, left-shift; if
1224    // not, shift to right and calculate its carry.
1225    private static long shiftLongBits(long bits, long digits) {
1226        if (digits > 0) {
1227            return bits << digits;
1228        }
1229        // change it to positive
1230        long absDigits = -digits;
1231        if (Long.numberOfLeadingZeros(bits & ~Double.SIGN_MASK) <= (64 - absDigits)) {
1232            // some bits will remain after shifting, calculates its carry
1233            if ((((bits >> (absDigits - 1)) & 0x1) == 0)
1234                    || Long.numberOfTrailingZeros(bits) == (absDigits - 1)) {
1235                return bits >> absDigits;
1236            }
1237            return ((bits >> absDigits) + 1);
1238        }
1239        return 0;
1240    }
1241}
1242