• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
26 package sun.misc;
27 
28 import sun.misc.FloatConsts;
29 import 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 
41 public 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      */
FpUtils()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
getExponent(double d)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
getExponent(float f)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
rawCopySign(double magnitude, double sign)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
rawCopySign(float magnitude, float sign)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
isFinite(double d)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
isFinite(float f)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      */
isInfinite(double d)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      */
isInfinite(float f)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      */
isNaN(double d)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      */
isNaN(float f)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      */
isUnordered(double arg1, double arg2)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      */
isUnordered(float arg1, float arg2)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      */
ilogb(double d)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      */
ilogb(float f)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
scalb(double d, int scale_factor)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
scalb(float f, int scale_factor)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
nextAfter(double start, double direction)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
nextAfter(float start, double direction)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
nextUp(double d)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
nextUp(float f)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
nextDown(double d)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
nextDown(float f)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
copySign(double magnitude, double sign)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
copySign(float magnitude, float sign)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
ulp(double d)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
ulp(float f)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
signum(double d)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
signum(float f)928     public static float signum(float f) {
929         return Math.signum(f);
930     }
931 }
932