Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/sun/misc/FpUtils.java
38829 views
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
*/
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
933