1/*
2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package sun.misc;
27
28import sun.misc.FloatConsts;
29import sun.misc.DoubleConsts;
30
31/**
32 * The class {@code FpUtils} contains static utility methods for
33 * manipulating and inspecting {@code float} and
34 * {@code double} floating-point numbers.  These methods include
35 * functionality recommended or required by the IEEE 754
36 * floating-point standard.
37 *
38 * @author Joseph D. Darcy
39 */
40
41public class FpUtils {
42    /*
43     * The methods in this class are reasonably implemented using
44     * direct or indirect bit-level manipulation of floating-point
45     * values.  However, having access to the IEEE 754 recommended
46     * functions would obviate the need for most programmers to engage
47     * in floating-point bit-twiddling.
48     *
49     * An IEEE 754 number has three fields, from most significant bit
50     * to to least significant, sign, exponent, and significand.
51     *
52     *  msb                                lsb
53     * [sign|exponent|  fractional_significand]
54     *
55     * Using some encoding cleverness, explained below, the high order
56     * bit of the logical significand does not need to be explicitly
57     * stored, thus "fractional_significand" instead of simply
58     * "significand" in the figure above.
59     *
60     * For finite normal numbers, the numerical value encoded is
61     *
62     * (-1)^sign * 2^(exponent)*(1.fractional_significand)
63     *
64     * Most finite floating-point numbers are normalized; the exponent
65     * value is reduced until the leading significand bit is 1.
66     * Therefore, the leading 1 is redundant and is not explicitly
67     * stored.  If a numerical value is so small it cannot be
68     * normalized, it has a subnormal representation. Subnormal
69     * numbers don't have a leading 1 in their significand; subnormals
70     * are encoding using a special exponent value.  In other words,
71     * the high-order bit of the logical significand can be elided in
72     * from the representation in either case since the bit's value is
73     * implicit from the exponent value.
74     *
75     * The exponent field uses a biased representation; if the bits of
76     * the exponent are interpreted as a unsigned integer E, the
77     * exponent represented is E - E_bias where E_bias depends on the
78     * floating-point format.  E can range between E_min and E_max,
79     * constants which depend on the floating-point format.  E_min and
80     * E_max are -126 and +127 for float, -1022 and +1023 for double.
81     *
82     * The 32-bit float format has 1 sign bit, 8 exponent bits, and 23
83     * bits for the significand (which is logically 24 bits wide
84     * because of the implicit bit).  The 64-bit double format has 1
85     * sign bit, 11 exponent bits, and 52 bits for the significand
86     * (logically 53 bits).
87     *
88     * Subnormal numbers and zero have the special exponent value
89     * E_min -1; the numerical value represented by a subnormal is:
90     *
91     * (-1)^sign * 2^(E_min)*(0.fractional_significand)
92     *
93     * Zero is represented by all zero bits in the exponent and all
94     * zero bits in the significand; zero can have either sign.
95     *
96     * Infinity and NaN are encoded using the exponent value E_max +
97     * 1.  Signed infinities have all significand bits zero; NaNs have
98     * at least one non-zero significand bit.
99     *
100     * The details of IEEE 754 floating-point encoding will be used in
101     * the methods below without further comment.  For further
102     * exposition on IEEE 754 numbers, see "IEEE Standard for Binary
103     * Floating-Point Arithmetic" ANSI/IEEE Std 754-1985 or William
104     * Kahan's "Lecture Notes on the Status of IEEE Standard 754 for
105     * Binary Floating-Point Arithmetic",
106     * http://www.cs.berkeley.edu/~wkahan/ieee754status/ieee754.ps.
107     *
108     * Many of this class's methods are members of the set of IEEE 754
109     * recommended functions or similar functions recommended or
110     * required by IEEE 754R.  Discussion of various implementation
111     * techniques for these functions have occurred in:
112     *
113     * W.J. Cody and Jerome T. Coonen, "Algorithm 772 Functions to
114     * Support the IEEE Standard for Binary Floating-Point
115     * Arithmetic," ACM Transactions on Mathematical Software,
116     * vol. 19, no. 4, December 1993, pp. 443-451.
117     *
118     * Joseph D. Darcy, "Writing robust IEEE recommended functions in
119     * ``100% Pure Java''(TM)," University of California, Berkeley
120     * technical report UCB//CSD-98-1009.
121     */
122
123    /**
124     * Don't let anyone instantiate this class.
125     */
126    private FpUtils() {}
127
128    // Helper Methods
129
130    // The following helper methods are used in the implementation of
131    // the public recommended functions; they generally omit certain
132    // tests for exception cases.
133
134    /**
135     * Returns unbiased exponent of a {@code double}.
136     * @deprecated Use Math.getExponent.
137     */
138    @Deprecated
139    public static int getExponent(double d){
140        return Math.getExponent(d);
141    }
142
143    /**
144     * Returns unbiased exponent of a {@code float}.
145     * @deprecated Use Math.getExponent.
146     */
147    @Deprecated
148    public static int getExponent(float f){
149        return Math.getExponent(f);
150    }
151
152
153    /**
154     * Returns the first floating-point argument with the sign of the
155     * second floating-point argument.  Note that unlike the {@link
156     * FpUtils#copySign(double, double) copySign} method, this method
157     * does not require NaN {@code sign} arguments to be treated
158     * as positive values; implementations are permitted to treat some
159     * NaN arguments as positive and other NaN arguments as negative
160     * to allow greater performance.
161     *
162     * @param magnitude  the parameter providing the magnitude of the result
163     * @param sign   the parameter providing the sign of the result
164     * @return a value with the magnitude of {@code magnitude}
165     * and the sign of {@code sign}.
166     * @author Joseph D. Darcy
167     * @deprecated Use Math.copySign.
168     */
169    @Deprecated
170    public static double rawCopySign(double magnitude, double sign) {
171        return Math.copySign(magnitude, sign);
172    }
173
174    /**
175     * Returns the first floating-point argument with the sign of the
176     * second floating-point argument.  Note that unlike the {@link
177     * FpUtils#copySign(float, float) copySign} method, this method
178     * does not require NaN {@code sign} arguments to be treated
179     * as positive values; implementations are permitted to treat some
180     * NaN arguments as positive and other NaN arguments as negative
181     * to allow greater performance.
182     *
183     * @param magnitude  the parameter providing the magnitude of the result
184     * @param sign   the parameter providing the sign of the result
185     * @return a value with the magnitude of {@code magnitude}
186     * and the sign of {@code sign}.
187     * @author Joseph D. Darcy
188     * @deprecated Use Math.copySign.
189     */
190    @Deprecated
191    public static float rawCopySign(float magnitude, float sign) {
192        return Math.copySign(magnitude, sign);
193    }
194
195    /* ***************************************************************** */
196
197    /**
198     * Returns {@code true} if the argument is a finite
199     * floating-point value; returns {@code false} otherwise (for
200     * NaN and infinity arguments).
201     *
202     * @param d the {@code double} value to be tested
203     * @return {@code true} if the argument is a finite
204     * floating-point value, {@code false} otherwise.
205     * @deprecated Use Double.isFinite.
206     */
207    @Deprecated
208    public static boolean isFinite(double d) {
209        return Double.isFinite(d);
210    }
211
212    /**
213     * Returns {@code true} if the argument is a finite
214     * floating-point value; returns {@code false} otherwise (for
215     * NaN and infinity arguments).
216     *
217     * @param f the {@code float} value to be tested
218     * @return {@code true} if the argument is a finite
219     * floating-point value, {@code false} otherwise.
220     * @deprecated Use Float.isFinite.
221     */
222     @Deprecated
223     public static boolean isFinite(float f) {
224         return Float.isFinite(f);
225    }
226
227    /**
228     * Returns {@code true} if the specified number is infinitely
229     * large in magnitude, {@code false} otherwise.
230     *
231     * <p>Note that this method is equivalent to the {@link
232     * Double#isInfinite(double) Double.isInfinite} method; the
233     * functionality is included in this class for convenience.
234     *
235     * @param   d   the value to be tested.
236     * @return  {@code true} if the value of the argument is positive
237     *          infinity or negative infinity; {@code false} otherwise.
238     */
239    public static boolean isInfinite(double d) {
240        return Double.isInfinite(d);
241    }
242
243    /**
244     * Returns {@code true} if the specified number is infinitely
245     * large in magnitude, {@code false} otherwise.
246     *
247     * <p>Note that this method is equivalent to the {@link
248     * Float#isInfinite(float) Float.isInfinite} method; the
249     * functionality is included in this class for convenience.
250     *
251     * @param   f   the value to be tested.
252     * @return  {@code true} if the argument is positive infinity or
253     *          negative infinity; {@code false} otherwise.
254     */
255     public static boolean isInfinite(float f) {
256         return Float.isInfinite(f);
257    }
258
259    /**
260     * Returns {@code true} if the specified number is a
261     * Not-a-Number (NaN) value, {@code false} otherwise.
262     *
263     * <p>Note that this method is equivalent to the {@link
264     * Double#isNaN(double) Double.isNaN} method; the functionality is
265     * included in this class for convenience.
266     *
267     * @param   d   the value to be tested.
268     * @return  {@code true} if the value of the argument is NaN;
269     *          {@code false} otherwise.
270     */
271    public static boolean isNaN(double d) {
272        return Double.isNaN(d);
273    }
274
275    /**
276     * Returns {@code true} if the specified number is a
277     * Not-a-Number (NaN) value, {@code false} otherwise.
278     *
279     * <p>Note that this method is equivalent to the {@link
280     * Float#isNaN(float) Float.isNaN} method; the functionality is
281     * included in this class for convenience.
282     *
283     * @param   f   the value to be tested.
284     * @return  {@code true} if the argument is NaN;
285     *          {@code false} otherwise.
286     */
287     public static boolean isNaN(float f) {
288        return Float.isNaN(f);
289    }
290
291    /**
292     * Returns {@code true} if the unordered relation holds
293     * between the two arguments.  When two floating-point values are
294     * unordered, one value is neither less than, equal to, nor
295     * greater than the other.  For the unordered relation to be true,
296     * at least one argument must be a {@code NaN}.
297     *
298     * @param arg1      the first argument
299     * @param arg2      the second argument
300     * @return {@code true} if at least one argument is a NaN,
301     * {@code false} otherwise.
302     */
303    public static boolean isUnordered(double arg1, double arg2) {
304        return isNaN(arg1) || isNaN(arg2);
305    }
306
307    /**
308     * Returns {@code true} if the unordered relation holds
309     * between the two arguments.  When two floating-point values are
310     * unordered, one value is neither less than, equal to, nor
311     * greater than the other.  For the unordered relation to be true,
312     * at least one argument must be a {@code NaN}.
313     *
314     * @param arg1      the first argument
315     * @param arg2      the second argument
316     * @return {@code true} if at least one argument is a NaN,
317     * {@code false} otherwise.
318     */
319     public static boolean isUnordered(float arg1, float arg2) {
320        return isNaN(arg1) || isNaN(arg2);
321    }
322
323    /**
324     * Returns unbiased exponent of a {@code double}; for
325     * subnormal values, the number is treated as if it were
326     * normalized.  That is for all finite, non-zero, positive numbers
327     * <i>x</i>, <code>scalb(<i>x</i>, -ilogb(<i>x</i>))</code> is
328     * always in the range [1, 2).
329     * <p>
330     * Special cases:
331     * <ul>
332     * <li> If the argument is NaN, then the result is 2<sup>30</sup>.
333     * <li> If the argument is infinite, then the result is 2<sup>28</sup>.
334     * <li> If the argument is zero, then the result is -(2<sup>28</sup>).
335     * </ul>
336     *
337     * @param d floating-point number whose exponent is to be extracted
338     * @return unbiased exponent of the argument.
339     * @author Joseph D. Darcy
340     */
341    public static int ilogb(double d) {
342        int exponent = getExponent(d);
343
344        switch (exponent) {
345        case DoubleConsts.MAX_EXPONENT+1:       // NaN or infinity
346            if( isNaN(d) )
347                return (1<<30);         // 2^30
348            else // infinite value
349                return (1<<28);         // 2^28
350
351        case DoubleConsts.MIN_EXPONENT-1:       // zero or subnormal
352            if(d == 0.0) {
353                return -(1<<28);        // -(2^28)
354            }
355            else {
356                long transducer = Double.doubleToRawLongBits(d);
357
358                /*
359                 * To avoid causing slow arithmetic on subnormals,
360                 * the scaling to determine when d's significand
361                 * is normalized is done in integer arithmetic.
362                 * (there must be at least one "1" bit in the
363                 * significand since zero has been screened out.
364                 */
365
366                // isolate significand bits
367                transducer &= DoubleConsts.SIGNIF_BIT_MASK;
368                assert(transducer != 0L);
369
370                // This loop is simple and functional. We might be
371                // able to do something more clever that was faster;
372                // e.g. number of leading zero detection on
373                // (transducer << (# exponent and sign bits).
374                while (transducer <
375                       (1L << (DoubleConsts.SIGNIFICAND_WIDTH - 1))) {
376                    transducer *= 2;
377                    exponent--;
378                }
379                exponent++;
380                assert( exponent >=
381                        DoubleConsts.MIN_EXPONENT - (DoubleConsts.SIGNIFICAND_WIDTH-1) &&
382                        exponent < DoubleConsts.MIN_EXPONENT);
383                return exponent;
384            }
385
386        default:
387            assert( exponent >= DoubleConsts.MIN_EXPONENT &&
388                    exponent <= DoubleConsts.MAX_EXPONENT);
389            return exponent;
390        }
391    }
392
393    /**
394     * Returns unbiased exponent of a {@code float}; for
395     * subnormal values, the number is treated as if it were
396     * normalized.  That is for all finite, non-zero, positive numbers
397     * <i>x</i>, <code>scalb(<i>x</i>, -ilogb(<i>x</i>))</code> is
398     * always in the range [1, 2).
399     * <p>
400     * Special cases:
401     * <ul>
402     * <li> If the argument is NaN, then the result is 2<sup>30</sup>.
403     * <li> If the argument is infinite, then the result is 2<sup>28</sup>.
404     * <li> If the argument is zero, then the result is -(2<sup>28</sup>).
405     * </ul>
406     *
407     * @param f floating-point number whose exponent is to be extracted
408     * @return unbiased exponent of the argument.
409     * @author Joseph D. Darcy
410     */
411     public static int ilogb(float f) {
412        int exponent = getExponent(f);
413
414        switch (exponent) {
415        case FloatConsts.MAX_EXPONENT+1:        // NaN or infinity
416            if( isNaN(f) )
417                return (1<<30);         // 2^30
418            else // infinite value
419                return (1<<28);         // 2^28
420
421        case FloatConsts.MIN_EXPONENT-1:        // zero or subnormal
422            if(f == 0.0f) {
423                return -(1<<28);        // -(2^28)
424            }
425            else {
426                int transducer = Float.floatToRawIntBits(f);
427
428                /*
429                 * To avoid causing slow arithmetic on subnormals,
430                 * the scaling to determine when f's significand
431                 * is normalized is done in integer arithmetic.
432                 * (there must be at least one "1" bit in the
433                 * significand since zero has been screened out.
434                 */
435
436                // isolate significand bits
437                transducer &= FloatConsts.SIGNIF_BIT_MASK;
438                assert(transducer != 0);
439
440                // This loop is simple and functional. We might be
441                // able to do something more clever that was faster;
442                // e.g. number of leading zero detection on
443                // (transducer << (# exponent and sign bits).
444                while (transducer <
445                       (1 << (FloatConsts.SIGNIFICAND_WIDTH - 1))) {
446                    transducer *= 2;
447                    exponent--;
448                }
449                exponent++;
450                assert( exponent >=
451                        FloatConsts.MIN_EXPONENT - (FloatConsts.SIGNIFICAND_WIDTH-1) &&
452                        exponent < FloatConsts.MIN_EXPONENT);
453                return exponent;
454            }
455
456        default:
457            assert( exponent >= FloatConsts.MIN_EXPONENT &&
458                    exponent <= FloatConsts.MAX_EXPONENT);
459            return exponent;
460        }
461    }
462
463
464    /*
465     * The scalb operation should be reasonably fast; however, there
466     * are tradeoffs in writing a method to minimize the worst case
467     * performance and writing a method to minimize the time for
468     * expected common inputs.  Some processors operate very slowly on
469     * subnormal operands, taking hundreds or thousands of cycles for
470     * one floating-point add or multiply as opposed to, say, four
471     * cycles for normal operands.  For processors with very slow
472     * subnormal execution, scalb would be fastest if written entirely
473     * with integer operations; in other words, scalb would need to
474     * include the logic of performing correct rounding of subnormal
475     * values.  This could be reasonably done in at most a few hundred
476     * cycles.  However, this approach may penalize normal operations
477     * since at least the exponent of the floating-point argument must
478     * be examined.
479     *
480     * The approach taken in this implementation is a compromise.
481     * Floating-point multiplication is used to do most of the work;
482     * but knowingly multiplying by a subnormal scaling factor is
483     * avoided.  However, the floating-point argument is not examined
484     * to see whether or not it is subnormal since subnormal inputs
485     * are assumed to be rare.  At most three multiplies are needed to
486     * scale from the largest to smallest exponent ranges (scaling
487     * down, at most two multiplies are needed if subnormal scaling
488     * factors are allowed).  However, in this implementation an
489     * expensive integer remainder operation is avoided at the cost of
490     * requiring five floating-point multiplies in the worst case,
491     * which should still be a performance win.
492     *
493     * If scaling of entire arrays is a concern, it would probably be
494     * more efficient to provide a double[] scalb(double[], int)
495     * version of scalb to avoid having to recompute the needed
496     * scaling factors for each floating-point value.
497     */
498
499    /**
500     * Return {@code d} &times;
501     * 2<sup>{@code scale_factor}</sup> rounded as if performed
502     * by a single correctly rounded floating-point multiply to a
503     * member of the double value set.  See section 4.2.3 of
504     * <cite>The Java&trade; Language Specification</cite>
505     * for a discussion of floating-point
506     * value sets.  If the exponent of the result is between the
507     * {@code double}'s minimum exponent and maximum exponent,
508     * the answer is calculated exactly.  If the exponent of the
509     * result would be larger than {@code doubles}'s maximum
510     * exponent, an infinity is returned.  Note that if the result is
511     * subnormal, precision may be lost; that is, when {@code scalb(x,
512     * n)} is subnormal, {@code scalb(scalb(x, n), -n)} may
513     * not equal <i>x</i>.  When the result is non-NaN, the result has
514     * the same sign as {@code d}.
515     *
516     *<p>
517     * Special cases:
518     * <ul>
519     * <li> If the first argument is NaN, NaN is returned.
520     * <li> If the first argument is infinite, then an infinity of the
521     * same sign is returned.
522     * <li> If the first argument is zero, then a zero of the same
523     * sign is returned.
524     * </ul>
525     *
526     * @param d number to be scaled by a power of two.
527     * @param scale_factor power of 2 used to scale {@code d}
528     * @return {@code d * }2<sup>{@code scale_factor}</sup>
529     * @author Joseph D. Darcy
530     * @deprecated Use Math.scalb.
531     */
532    @Deprecated
533    public static double scalb(double d, int scale_factor) {
534        return Math.scalb(d, scale_factor);
535    }
536
537    /**
538     * Return {@code f} &times;
539     * 2<sup>{@code scale_factor}</sup> rounded as if performed
540     * by a single correctly rounded floating-point multiply to a
541     * member of the float value set.  See section 4.2.3 of
542     * <cite>The Java&trade; Language Specification</cite>
543     * for a discussion of floating-point
544     * value sets. If the exponent of the result is between the
545     * {@code float}'s minimum exponent and maximum exponent, the
546     * answer is calculated exactly.  If the exponent of the result
547     * would be larger than {@code float}'s maximum exponent, an
548     * infinity is returned.  Note that if the result is subnormal,
549     * precision may be lost; that is, when {@code scalb(x, n)}
550     * is subnormal, {@code scalb(scalb(x, n), -n)} may not equal
551     * <i>x</i>.  When the result is non-NaN, the result has the same
552     * sign as {@code f}.
553     *
554     *<p>
555     * Special cases:
556     * <ul>
557     * <li> If the first argument is NaN, NaN is returned.
558     * <li> If the first argument is infinite, then an infinity of the
559     * same sign is returned.
560     * <li> If the first argument is zero, then a zero of the same
561     * sign is returned.
562     * </ul>
563     *
564     * @param f number to be scaled by a power of two.
565     * @param scale_factor power of 2 used to scale {@code f}
566     * @return {@code f * }2<sup>{@code scale_factor}</sup>
567     * @author Joseph D. Darcy
568     * @deprecated Use Math.scalb.
569     */
570    @Deprecated
571    public static float scalb(float f, int scale_factor) {
572        return Math.scalb(f, scale_factor);
573    }
574
575    /**
576     * Returns the floating-point number adjacent to the first
577     * argument in the direction of the second argument.  If both
578     * arguments compare as equal the second argument is returned.
579     *
580     * <p>
581     * Special cases:
582     * <ul>
583     * <li> If either argument is a NaN, then NaN is returned.
584     *
585     * <li> If both arguments are signed zeros, {@code direction}
586     * is returned unchanged (as implied by the requirement of
587     * returning the second argument if the arguments compare as
588     * equal).
589     *
590     * <li> If {@code start} is
591     * &plusmn;{@code Double.MIN_VALUE} and {@code direction}
592     * has a value such that the result should have a smaller
593     * magnitude, then a zero with the same sign as {@code start}
594     * is returned.
595     *
596     * <li> If {@code start} is infinite and
597     * {@code direction} has a value such that the result should
598     * have a smaller magnitude, {@code Double.MAX_VALUE} with the
599     * same sign as {@code start} is returned.
600     *
601     * <li> If {@code start} is equal to &plusmn;
602     * {@code Double.MAX_VALUE} and {@code direction} has a
603     * value such that the result should have a larger magnitude, an
604     * infinity with same sign as {@code start} is returned.
605     * </ul>
606     *
607     * @param start     starting floating-point value
608     * @param direction value indicating which of
609     * {@code start}'s neighbors or {@code start} should
610     * be returned
611     * @return The floating-point number adjacent to {@code start} in the
612     * direction of {@code direction}.
613     * @author Joseph D. Darcy
614     * @deprecated Use Math.nextAfter
615     */
616    @Deprecated
617    public static double nextAfter(double start, double direction) {
618        return Math.nextAfter(start, direction);
619    }
620
621    /**
622     * Returns the floating-point number adjacent to the first
623     * argument in the direction of the second argument.  If both
624     * arguments compare as equal, the second argument is returned.
625     *
626     * <p>
627     * Special cases:
628     * <ul>
629     * <li> If either argument is a NaN, then NaN is returned.
630     *
631     * <li> If both arguments are signed zeros, a {@code float}
632     * zero with the same sign as {@code direction} is returned
633     * (as implied by the requirement of returning the second argument
634     * if the arguments compare as equal).
635     *
636     * <li> If {@code start} is
637     * &plusmn;{@code Float.MIN_VALUE} and {@code direction}
638     * has a value such that the result should have a smaller
639     * magnitude, then a zero with the same sign as {@code start}
640     * is returned.
641     *
642     * <li> If {@code start} is infinite and
643     * {@code direction} has a value such that the result should
644     * have a smaller magnitude, {@code Float.MAX_VALUE} with the
645     * same sign as {@code start} is returned.
646     *
647     * <li> If {@code start} is equal to &plusmn;
648     * {@code Float.MAX_VALUE} and {@code direction} has a
649     * value such that the result should have a larger magnitude, an
650     * infinity with same sign as {@code start} is returned.
651     * </ul>
652     *
653     * @param start     starting floating-point value
654     * @param direction value indicating which of
655     * {@code start}'s neighbors or {@code start} should
656     * be returned
657     * @return The floating-point number adjacent to {@code start} in the
658     * direction of {@code direction}.
659     * @author Joseph D. Darcy
660     * @deprecated Use Math.nextAfter.
661     */
662    @Deprecated
663    public static float nextAfter(float start, double direction) {
664        return Math.nextAfter(start, direction);
665    }
666
667    /**
668     * Returns the floating-point value adjacent to {@code d} in
669     * the direction of positive infinity.  This method is
670     * semantically equivalent to {@code nextAfter(d,
671     * Double.POSITIVE_INFINITY)}; however, a {@code nextUp}
672     * implementation may run faster than its equivalent
673     * {@code nextAfter} call.
674     *
675     * <p>Special Cases:
676     * <ul>
677     * <li> If the argument is NaN, the result is NaN.
678     *
679     * <li> If the argument is positive infinity, the result is
680     * positive infinity.
681     *
682     * <li> If the argument is zero, the result is
683     * {@code Double.MIN_VALUE}
684     *
685     * </ul>
686     *
687     * @param d  starting floating-point value
688     * @return The adjacent floating-point value closer to positive
689     * infinity.
690     * @author Joseph D. Darcy
691     * @deprecated use Math.nextUp.
692     */
693    @Deprecated
694    public static double nextUp(double d) {
695        return Math.nextUp(d);
696    }
697
698    /**
699     * Returns the floating-point value adjacent to {@code f} in
700     * the direction of positive infinity.  This method is
701     * semantically equivalent to {@code nextAfter(f,
702     * Double.POSITIVE_INFINITY)}; however, a {@code nextUp}
703     * implementation may run faster than its equivalent
704     * {@code nextAfter} call.
705     *
706     * <p>Special Cases:
707     * <ul>
708     * <li> If the argument is NaN, the result is NaN.
709     *
710     * <li> If the argument is positive infinity, the result is
711     * positive infinity.
712     *
713     * <li> If the argument is zero, the result is
714     * {@code Float.MIN_VALUE}
715     *
716     * </ul>
717     *
718     * @param f  starting floating-point value
719     * @return The adjacent floating-point value closer to positive
720     * infinity.
721     * @author Joseph D. Darcy
722     * @deprecated Use Math.nextUp.
723     */
724    @Deprecated
725    public static float nextUp(float f) {
726        return Math.nextUp(f);
727    }
728
729    /**
730     * Returns the floating-point value adjacent to {@code d} in
731     * the direction of negative infinity.  This method is
732     * semantically equivalent to {@code nextAfter(d,
733     * Double.NEGATIVE_INFINITY)}; however, a
734     * {@code nextDown} implementation may run faster than its
735     * equivalent {@code nextAfter} call.
736     *
737     * <p>Special Cases:
738     * <ul>
739     * <li> If the argument is NaN, the result is NaN.
740     *
741     * <li> If the argument is negative infinity, the result is
742     * negative infinity.
743     *
744     * <li> If the argument is zero, the result is
745     * {@code -Double.MIN_VALUE}
746     *
747     * </ul>
748     *
749     * @param d  starting floating-point value
750     * @return The adjacent floating-point value closer to negative
751     * infinity.
752     * @author Joseph D. Darcy
753     * @deprecated Use Math.nextDown.
754     */
755    @Deprecated
756    public static double nextDown(double d) {
757        return Math.nextDown(d);
758    }
759
760    /**
761     * Returns the floating-point value adjacent to {@code f} in
762     * the direction of negative infinity.  This method is
763     * semantically equivalent to {@code nextAfter(f,
764     * Float.NEGATIVE_INFINITY)}; however, a
765     * {@code nextDown} implementation may run faster than its
766     * equivalent {@code nextAfter} call.
767     *
768     * <p>Special Cases:
769     * <ul>
770     * <li> If the argument is NaN, the result is NaN.
771     *
772     * <li> If the argument is negative infinity, the result is
773     * negative infinity.
774     *
775     * <li> If the argument is zero, the result is
776     * {@code -Float.MIN_VALUE}
777     *
778     * </ul>
779     *
780     * @param f  starting floating-point value
781     * @return The adjacent floating-point value closer to negative
782     * infinity.
783     * @author Joseph D. Darcy
784     * @deprecated Use Math.nextDown.
785     */
786    @Deprecated
787    public static double nextDown(float f) {
788        return Math.nextDown(f);
789    }
790
791    /**
792     * Returns the first floating-point argument with the sign of the
793     * second floating-point argument.  For this method, a NaN
794     * {@code sign} argument is always treated as if it were
795     * positive.
796     *
797     * @param magnitude  the parameter providing the magnitude of the result
798     * @param sign   the parameter providing the sign of the result
799     * @return a value with the magnitude of {@code magnitude}
800     * and the sign of {@code sign}.
801     * @author Joseph D. Darcy
802     * @since 1.5
803     * @deprecated Use StrictMath.copySign.
804     */
805    @Deprecated
806    public static double copySign(double magnitude, double sign) {
807        return StrictMath.copySign(magnitude, sign);
808    }
809
810    /**
811     * Returns the first floating-point argument with the sign of the
812     * second floating-point argument.  For this method, a NaN
813     * {@code sign} argument is always treated as if it were
814     * positive.
815     *
816     * @param magnitude  the parameter providing the magnitude of the result
817     * @param sign   the parameter providing the sign of the result
818     * @return a value with the magnitude of {@code magnitude}
819     * and the sign of {@code sign}.
820     * @author Joseph D. Darcy
821     * @deprecated Use StrictMath.copySign.
822     */
823    @Deprecated
824    public static float copySign(float magnitude, float sign) {
825        return StrictMath.copySign(magnitude, sign);
826    }
827
828    /**
829     * Returns the size of an ulp of the argument.  An ulp of a
830     * {@code double} value is the positive distance between this
831     * floating-point value and the {@code double} value next
832     * larger in magnitude.  Note that for non-NaN <i>x</i>,
833     * <code>ulp(-<i>x</i>) == ulp(<i>x</i>)</code>.
834     *
835     * <p>Special Cases:
836     * <ul>
837     * <li> If the argument is NaN, then the result is NaN.
838     * <li> If the argument is positive or negative infinity, then the
839     * result is positive infinity.
840     * <li> If the argument is positive or negative zero, then the result is
841     * {@code Double.MIN_VALUE}.
842     * <li> If the argument is &plusmn;{@code Double.MAX_VALUE}, then
843     * the result is equal to 2<sup>971</sup>.
844     * </ul>
845     *
846     * @param d the floating-point value whose ulp is to be returned
847     * @return the size of an ulp of the argument
848     * @author Joseph D. Darcy
849     * @since 1.5
850     * @deprecated Use Math.ulp.
851     */
852    @Deprecated
853    public static double ulp(double d) {
854        return Math.ulp(d);
855    }
856
857    /**
858     * Returns the size of an ulp of the argument.  An ulp of a
859     * {@code float} value is the positive distance between this
860     * floating-point value and the {@code float} value next
861     * larger in magnitude.  Note that for non-NaN <i>x</i>,
862     * <code>ulp(-<i>x</i>) == ulp(<i>x</i>)</code>.
863     *
864     * <p>Special Cases:
865     * <ul>
866     * <li> If the argument is NaN, then the result is NaN.
867     * <li> If the argument is positive or negative infinity, then the
868     * result is positive infinity.
869     * <li> If the argument is positive or negative zero, then the result is
870     * {@code Float.MIN_VALUE}.
871     * <li> If the argument is &plusmn;{@code Float.MAX_VALUE}, then
872     * the result is equal to 2<sup>104</sup>.
873     * </ul>
874     *
875     * @param f the floating-point value whose ulp is to be returned
876     * @return the size of an ulp of the argument
877     * @author Joseph D. Darcy
878     * @since 1.5
879     * @deprecated Use Math.ulp.
880     */
881     @Deprecated
882     public static float ulp(float f) {
883        return Math.ulp(f);
884     }
885
886    /**
887     * Returns the signum function of the argument; zero if the argument
888     * is zero, 1.0 if the argument is greater than zero, -1.0 if the
889     * argument is less than zero.
890     *
891     * <p>Special Cases:
892     * <ul>
893     * <li> If the argument is NaN, then the result is NaN.
894     * <li> If the argument is positive zero or negative zero, then the
895     *      result is the same as the argument.
896     * </ul>
897     *
898     * @param d the floating-point value whose signum is to be returned
899     * @return the signum function of the argument
900     * @author Joseph D. Darcy
901     * @since 1.5
902     * @deprecated Use Math.signum.
903     */
904    @Deprecated
905    public static double signum(double d) {
906        return Math.signum(d);
907    }
908
909    /**
910     * Returns the signum function of the argument; zero if the argument
911     * is zero, 1.0f if the argument is greater than zero, -1.0f if the
912     * argument is less than zero.
913     *
914     * <p>Special Cases:
915     * <ul>
916     * <li> If the argument is NaN, then the result is NaN.
917     * <li> If the argument is positive zero or negative zero, then the
918     *      result is the same as the argument.
919     * </ul>
920     *
921     * @param f the floating-point value whose signum is to be returned
922     * @return the signum function of the argument
923     * @author Joseph D. Darcy
924     * @since 1.5
925     * @deprecated Use Math.signum.
926     */
927    @Deprecated
928    public static float signum(float f) {
929        return Math.signum(f);
930    }
931}
932