Coverage Report

Created: 2025-08-26 06:32

/rust/registry/src/index.crates.io-6f17d22bba15001f/num-traits-0.2.19/src/float.rs
Line
Count
Source (jump to first uncovered line)
1
use core::cmp::Ordering;
2
use core::num::FpCategory;
3
use core::ops::{Add, Div, Neg};
4
5
use core::f32;
6
use core::f64;
7
8
use crate::{Num, NumCast, ToPrimitive};
9
10
/// Generic trait for floating point numbers that works with `no_std`.
11
///
12
/// This trait implements a subset of the `Float` trait.
13
pub trait FloatCore: Num + NumCast + Neg<Output = Self> + PartialOrd + Copy {
14
    /// Returns positive infinity.
15
    ///
16
    /// # Examples
17
    ///
18
    /// ```
19
    /// use num_traits::float::FloatCore;
20
    /// use std::{f32, f64};
21
    ///
22
    /// fn check<T: FloatCore>(x: T) {
23
    ///     assert!(T::infinity() == x);
24
    /// }
25
    ///
26
    /// check(f32::INFINITY);
27
    /// check(f64::INFINITY);
28
    /// ```
29
    fn infinity() -> Self;
30
31
    /// Returns negative infinity.
32
    ///
33
    /// # Examples
34
    ///
35
    /// ```
36
    /// use num_traits::float::FloatCore;
37
    /// use std::{f32, f64};
38
    ///
39
    /// fn check<T: FloatCore>(x: T) {
40
    ///     assert!(T::neg_infinity() == x);
41
    /// }
42
    ///
43
    /// check(f32::NEG_INFINITY);
44
    /// check(f64::NEG_INFINITY);
45
    /// ```
46
    fn neg_infinity() -> Self;
47
48
    /// Returns NaN.
49
    ///
50
    /// # Examples
51
    ///
52
    /// ```
53
    /// use num_traits::float::FloatCore;
54
    ///
55
    /// fn check<T: FloatCore>() {
56
    ///     let n = T::nan();
57
    ///     assert!(n != n);
58
    /// }
59
    ///
60
    /// check::<f32>();
61
    /// check::<f64>();
62
    /// ```
63
    fn nan() -> Self;
64
65
    /// Returns `-0.0`.
66
    ///
67
    /// # Examples
68
    ///
69
    /// ```
70
    /// use num_traits::float::FloatCore;
71
    /// use std::{f32, f64};
72
    ///
73
    /// fn check<T: FloatCore>(n: T) {
74
    ///     let z = T::neg_zero();
75
    ///     assert!(z.is_zero());
76
    ///     assert!(T::one() / z == n);
77
    /// }
78
    ///
79
    /// check(f32::NEG_INFINITY);
80
    /// check(f64::NEG_INFINITY);
81
    /// ```
82
    fn neg_zero() -> Self;
83
84
    /// Returns the smallest finite value that this type can represent.
85
    ///
86
    /// # Examples
87
    ///
88
    /// ```
89
    /// use num_traits::float::FloatCore;
90
    /// use std::{f32, f64};
91
    ///
92
    /// fn check<T: FloatCore>(x: T) {
93
    ///     assert!(T::min_value() == x);
94
    /// }
95
    ///
96
    /// check(f32::MIN);
97
    /// check(f64::MIN);
98
    /// ```
99
    fn min_value() -> Self;
100
101
    /// Returns the smallest positive, normalized value that this type can represent.
102
    ///
103
    /// # Examples
104
    ///
105
    /// ```
106
    /// use num_traits::float::FloatCore;
107
    /// use std::{f32, f64};
108
    ///
109
    /// fn check<T: FloatCore>(x: T) {
110
    ///     assert!(T::min_positive_value() == x);
111
    /// }
112
    ///
113
    /// check(f32::MIN_POSITIVE);
114
    /// check(f64::MIN_POSITIVE);
115
    /// ```
116
    fn min_positive_value() -> Self;
117
118
    /// Returns epsilon, a small positive value.
119
    ///
120
    /// # Examples
121
    ///
122
    /// ```
123
    /// use num_traits::float::FloatCore;
124
    /// use std::{f32, f64};
125
    ///
126
    /// fn check<T: FloatCore>(x: T) {
127
    ///     assert!(T::epsilon() == x);
128
    /// }
129
    ///
130
    /// check(f32::EPSILON);
131
    /// check(f64::EPSILON);
132
    /// ```
133
    fn epsilon() -> Self;
134
135
    /// Returns the largest finite value that this type can represent.
136
    ///
137
    /// # Examples
138
    ///
139
    /// ```
140
    /// use num_traits::float::FloatCore;
141
    /// use std::{f32, f64};
142
    ///
143
    /// fn check<T: FloatCore>(x: T) {
144
    ///     assert!(T::max_value() == x);
145
    /// }
146
    ///
147
    /// check(f32::MAX);
148
    /// check(f64::MAX);
149
    /// ```
150
    fn max_value() -> Self;
151
152
    /// Returns `true` if the number is NaN.
153
    ///
154
    /// # Examples
155
    ///
156
    /// ```
157
    /// use num_traits::float::FloatCore;
158
    /// use std::{f32, f64};
159
    ///
160
    /// fn check<T: FloatCore>(x: T, p: bool) {
161
    ///     assert!(x.is_nan() == p);
162
    /// }
163
    ///
164
    /// check(f32::NAN, true);
165
    /// check(f32::INFINITY, false);
166
    /// check(f64::NAN, true);
167
    /// check(0.0f64, false);
168
    /// ```
169
    #[inline]
170
    #[allow(clippy::eq_op)]
171
0
    fn is_nan(self) -> bool {
172
0
        self != self
173
0
    }
174
175
    /// Returns `true` if the number is infinite.
176
    ///
177
    /// # Examples
178
    ///
179
    /// ```
180
    /// use num_traits::float::FloatCore;
181
    /// use std::{f32, f64};
182
    ///
183
    /// fn check<T: FloatCore>(x: T, p: bool) {
184
    ///     assert!(x.is_infinite() == p);
185
    /// }
186
    ///
187
    /// check(f32::INFINITY, true);
188
    /// check(f32::NEG_INFINITY, true);
189
    /// check(f32::NAN, false);
190
    /// check(f64::INFINITY, true);
191
    /// check(f64::NEG_INFINITY, true);
192
    /// check(0.0f64, false);
193
    /// ```
194
    #[inline]
195
0
    fn is_infinite(self) -> bool {
196
0
        self == Self::infinity() || self == Self::neg_infinity()
197
0
    }
198
199
    /// Returns `true` if the number is neither infinite or NaN.
200
    ///
201
    /// # Examples
202
    ///
203
    /// ```
204
    /// use num_traits::float::FloatCore;
205
    /// use std::{f32, f64};
206
    ///
207
    /// fn check<T: FloatCore>(x: T, p: bool) {
208
    ///     assert!(x.is_finite() == p);
209
    /// }
210
    ///
211
    /// check(f32::INFINITY, false);
212
    /// check(f32::MAX, true);
213
    /// check(f64::NEG_INFINITY, false);
214
    /// check(f64::MIN_POSITIVE, true);
215
    /// check(f64::NAN, false);
216
    /// ```
217
    #[inline]
218
0
    fn is_finite(self) -> bool {
219
0
        !(self.is_nan() || self.is_infinite())
220
0
    }
221
222
    /// Returns `true` if the number is neither zero, infinite, subnormal or NaN.
223
    ///
224
    /// # Examples
225
    ///
226
    /// ```
227
    /// use num_traits::float::FloatCore;
228
    /// use std::{f32, f64};
229
    ///
230
    /// fn check<T: FloatCore>(x: T, p: bool) {
231
    ///     assert!(x.is_normal() == p);
232
    /// }
233
    ///
234
    /// check(f32::INFINITY, false);
235
    /// check(f32::MAX, true);
236
    /// check(f64::NEG_INFINITY, false);
237
    /// check(f64::MIN_POSITIVE, true);
238
    /// check(0.0f64, false);
239
    /// ```
240
    #[inline]
241
0
    fn is_normal(self) -> bool {
242
0
        self.classify() == FpCategory::Normal
243
0
    }
244
245
    /// Returns `true` if the number is [subnormal].
246
    ///
247
    /// ```
248
    /// use num_traits::float::FloatCore;
249
    /// use std::f64;
250
    ///
251
    /// let min = f64::MIN_POSITIVE; // 2.2250738585072014e-308_f64
252
    /// let max = f64::MAX;
253
    /// let lower_than_min = 1.0e-308_f64;
254
    /// let zero = 0.0_f64;
255
    ///
256
    /// assert!(!min.is_subnormal());
257
    /// assert!(!max.is_subnormal());
258
    ///
259
    /// assert!(!zero.is_subnormal());
260
    /// assert!(!f64::NAN.is_subnormal());
261
    /// assert!(!f64::INFINITY.is_subnormal());
262
    /// // Values between `0` and `min` are Subnormal.
263
    /// assert!(lower_than_min.is_subnormal());
264
    /// ```
265
    /// [subnormal]: https://en.wikipedia.org/wiki/Subnormal_number
266
    #[inline]
267
0
    fn is_subnormal(self) -> bool {
268
0
        self.classify() == FpCategory::Subnormal
269
0
    }
270
271
    /// Returns the floating point category of the number. If only one property
272
    /// is going to be tested, it is generally faster to use the specific
273
    /// predicate instead.
274
    ///
275
    /// # Examples
276
    ///
277
    /// ```
278
    /// use num_traits::float::FloatCore;
279
    /// use std::{f32, f64};
280
    /// use std::num::FpCategory;
281
    ///
282
    /// fn check<T: FloatCore>(x: T, c: FpCategory) {
283
    ///     assert!(x.classify() == c);
284
    /// }
285
    ///
286
    /// check(f32::INFINITY, FpCategory::Infinite);
287
    /// check(f32::MAX, FpCategory::Normal);
288
    /// check(f64::NAN, FpCategory::Nan);
289
    /// check(f64::MIN_POSITIVE, FpCategory::Normal);
290
    /// check(f64::MIN_POSITIVE / 2.0, FpCategory::Subnormal);
291
    /// check(0.0f64, FpCategory::Zero);
292
    /// ```
293
    fn classify(self) -> FpCategory;
294
295
    /// Returns the largest integer less than or equal to a number.
296
    ///
297
    /// # Examples
298
    ///
299
    /// ```
300
    /// use num_traits::float::FloatCore;
301
    /// use std::{f32, f64};
302
    ///
303
    /// fn check<T: FloatCore>(x: T, y: T) {
304
    ///     assert!(x.floor() == y);
305
    /// }
306
    ///
307
    /// check(f32::INFINITY, f32::INFINITY);
308
    /// check(0.9f32, 0.0);
309
    /// check(1.0f32, 1.0);
310
    /// check(1.1f32, 1.0);
311
    /// check(-0.0f64, 0.0);
312
    /// check(-0.9f64, -1.0);
313
    /// check(-1.0f64, -1.0);
314
    /// check(-1.1f64, -2.0);
315
    /// check(f64::MIN, f64::MIN);
316
    /// ```
317
    #[inline]
318
0
    fn floor(self) -> Self {
319
0
        let f = self.fract();
320
0
        if f.is_nan() || f.is_zero() {
321
0
            self
322
0
        } else if self < Self::zero() {
323
0
            self - f - Self::one()
324
        } else {
325
0
            self - f
326
        }
327
0
    }
328
329
    /// Returns the smallest integer greater than or equal to a number.
330
    ///
331
    /// # Examples
332
    ///
333
    /// ```
334
    /// use num_traits::float::FloatCore;
335
    /// use std::{f32, f64};
336
    ///
337
    /// fn check<T: FloatCore>(x: T, y: T) {
338
    ///     assert!(x.ceil() == y);
339
    /// }
340
    ///
341
    /// check(f32::INFINITY, f32::INFINITY);
342
    /// check(0.9f32, 1.0);
343
    /// check(1.0f32, 1.0);
344
    /// check(1.1f32, 2.0);
345
    /// check(-0.0f64, 0.0);
346
    /// check(-0.9f64, -0.0);
347
    /// check(-1.0f64, -1.0);
348
    /// check(-1.1f64, -1.0);
349
    /// check(f64::MIN, f64::MIN);
350
    /// ```
351
    #[inline]
352
0
    fn ceil(self) -> Self {
353
0
        let f = self.fract();
354
0
        if f.is_nan() || f.is_zero() {
355
0
            self
356
0
        } else if self > Self::zero() {
357
0
            self - f + Self::one()
358
        } else {
359
0
            self - f
360
        }
361
0
    }
362
363
    /// Returns the nearest integer to a number. Round half-way cases away from `0.0`.
364
    ///
365
    /// # Examples
366
    ///
367
    /// ```
368
    /// use num_traits::float::FloatCore;
369
    /// use std::{f32, f64};
370
    ///
371
    /// fn check<T: FloatCore>(x: T, y: T) {
372
    ///     assert!(x.round() == y);
373
    /// }
374
    ///
375
    /// check(f32::INFINITY, f32::INFINITY);
376
    /// check(0.4f32, 0.0);
377
    /// check(0.5f32, 1.0);
378
    /// check(0.6f32, 1.0);
379
    /// check(-0.4f64, 0.0);
380
    /// check(-0.5f64, -1.0);
381
    /// check(-0.6f64, -1.0);
382
    /// check(f64::MIN, f64::MIN);
383
    /// ```
384
    #[inline]
385
0
    fn round(self) -> Self {
386
0
        let one = Self::one();
387
0
        let h = Self::from(0.5).expect("Unable to cast from 0.5");
388
0
        let f = self.fract();
389
0
        if f.is_nan() || f.is_zero() {
390
0
            self
391
0
        } else if self > Self::zero() {
392
0
            if f < h {
393
0
                self - f
394
            } else {
395
0
                self - f + one
396
            }
397
0
        } else if -f < h {
398
0
            self - f
399
        } else {
400
0
            self - f - one
401
        }
402
0
    }
403
404
    /// Return the integer part of a number.
405
    ///
406
    /// # Examples
407
    ///
408
    /// ```
409
    /// use num_traits::float::FloatCore;
410
    /// use std::{f32, f64};
411
    ///
412
    /// fn check<T: FloatCore>(x: T, y: T) {
413
    ///     assert!(x.trunc() == y);
414
    /// }
415
    ///
416
    /// check(f32::INFINITY, f32::INFINITY);
417
    /// check(0.9f32, 0.0);
418
    /// check(1.0f32, 1.0);
419
    /// check(1.1f32, 1.0);
420
    /// check(-0.0f64, 0.0);
421
    /// check(-0.9f64, -0.0);
422
    /// check(-1.0f64, -1.0);
423
    /// check(-1.1f64, -1.0);
424
    /// check(f64::MIN, f64::MIN);
425
    /// ```
426
    #[inline]
427
0
    fn trunc(self) -> Self {
428
0
        let f = self.fract();
429
0
        if f.is_nan() {
430
0
            self
431
        } else {
432
0
            self - f
433
        }
434
0
    }
435
436
    /// Returns the fractional part of a number.
437
    ///
438
    /// # Examples
439
    ///
440
    /// ```
441
    /// use num_traits::float::FloatCore;
442
    /// use std::{f32, f64};
443
    ///
444
    /// fn check<T: FloatCore>(x: T, y: T) {
445
    ///     assert!(x.fract() == y);
446
    /// }
447
    ///
448
    /// check(f32::MAX, 0.0);
449
    /// check(0.75f32, 0.75);
450
    /// check(1.0f32, 0.0);
451
    /// check(1.25f32, 0.25);
452
    /// check(-0.0f64, 0.0);
453
    /// check(-0.75f64, -0.75);
454
    /// check(-1.0f64, 0.0);
455
    /// check(-1.25f64, -0.25);
456
    /// check(f64::MIN, 0.0);
457
    /// ```
458
    #[inline]
459
0
    fn fract(self) -> Self {
460
0
        if self.is_zero() {
461
0
            Self::zero()
462
        } else {
463
0
            self % Self::one()
464
        }
465
0
    }
466
467
    /// Computes the absolute value of `self`. Returns `FloatCore::nan()` if the
468
    /// number is `FloatCore::nan()`.
469
    ///
470
    /// # Examples
471
    ///
472
    /// ```
473
    /// use num_traits::float::FloatCore;
474
    /// use std::{f32, f64};
475
    ///
476
    /// fn check<T: FloatCore>(x: T, y: T) {
477
    ///     assert!(x.abs() == y);
478
    /// }
479
    ///
480
    /// check(f32::INFINITY, f32::INFINITY);
481
    /// check(1.0f32, 1.0);
482
    /// check(0.0f64, 0.0);
483
    /// check(-0.0f64, 0.0);
484
    /// check(-1.0f64, 1.0);
485
    /// check(f64::MIN, f64::MAX);
486
    /// ```
487
    #[inline]
488
0
    fn abs(self) -> Self {
489
0
        if self.is_sign_positive() {
490
0
            return self;
491
0
        }
492
0
        if self.is_sign_negative() {
493
0
            return -self;
494
0
        }
495
0
        Self::nan()
496
0
    }
497
498
    /// Returns a number that represents the sign of `self`.
499
    ///
500
    /// - `1.0` if the number is positive, `+0.0` or `FloatCore::infinity()`
501
    /// - `-1.0` if the number is negative, `-0.0` or `FloatCore::neg_infinity()`
502
    /// - `FloatCore::nan()` if the number is `FloatCore::nan()`
503
    ///
504
    /// # Examples
505
    ///
506
    /// ```
507
    /// use num_traits::float::FloatCore;
508
    /// use std::{f32, f64};
509
    ///
510
    /// fn check<T: FloatCore>(x: T, y: T) {
511
    ///     assert!(x.signum() == y);
512
    /// }
513
    ///
514
    /// check(f32::INFINITY, 1.0);
515
    /// check(3.0f32, 1.0);
516
    /// check(0.0f32, 1.0);
517
    /// check(-0.0f64, -1.0);
518
    /// check(-3.0f64, -1.0);
519
    /// check(f64::MIN, -1.0);
520
    /// ```
521
    #[inline]
522
0
    fn signum(self) -> Self {
523
0
        if self.is_nan() {
524
0
            Self::nan()
525
0
        } else if self.is_sign_negative() {
526
0
            -Self::one()
527
        } else {
528
0
            Self::one()
529
        }
530
0
    }
531
532
    /// Returns `true` if `self` is positive, including `+0.0` and
533
    /// `FloatCore::infinity()`, and `FloatCore::nan()`.
534
    ///
535
    /// # Examples
536
    ///
537
    /// ```
538
    /// use num_traits::float::FloatCore;
539
    /// use std::{f32, f64};
540
    ///
541
    /// fn check<T: FloatCore>(x: T, p: bool) {
542
    ///     assert!(x.is_sign_positive() == p);
543
    /// }
544
    ///
545
    /// check(f32::INFINITY, true);
546
    /// check(f32::MAX, true);
547
    /// check(0.0f32, true);
548
    /// check(-0.0f64, false);
549
    /// check(f64::NEG_INFINITY, false);
550
    /// check(f64::MIN_POSITIVE, true);
551
    /// check(f64::NAN, true);
552
    /// check(-f64::NAN, false);
553
    /// ```
554
    #[inline]
555
0
    fn is_sign_positive(self) -> bool {
556
0
        !self.is_sign_negative()
557
0
    }
558
559
    /// Returns `true` if `self` is negative, including `-0.0` and
560
    /// `FloatCore::neg_infinity()`, and `-FloatCore::nan()`.
561
    ///
562
    /// # Examples
563
    ///
564
    /// ```
565
    /// use num_traits::float::FloatCore;
566
    /// use std::{f32, f64};
567
    ///
568
    /// fn check<T: FloatCore>(x: T, p: bool) {
569
    ///     assert!(x.is_sign_negative() == p);
570
    /// }
571
    ///
572
    /// check(f32::INFINITY, false);
573
    /// check(f32::MAX, false);
574
    /// check(0.0f32, false);
575
    /// check(-0.0f64, true);
576
    /// check(f64::NEG_INFINITY, true);
577
    /// check(f64::MIN_POSITIVE, false);
578
    /// check(f64::NAN, false);
579
    /// check(-f64::NAN, true);
580
    /// ```
581
    #[inline]
582
0
    fn is_sign_negative(self) -> bool {
583
0
        let (_, _, sign) = self.integer_decode();
584
0
        sign < 0
585
0
    }
586
587
    /// Returns the minimum of the two numbers.
588
    ///
589
    /// If one of the arguments is NaN, then the other argument is returned.
590
    ///
591
    /// # Examples
592
    ///
593
    /// ```
594
    /// use num_traits::float::FloatCore;
595
    /// use std::{f32, f64};
596
    ///
597
    /// fn check<T: FloatCore>(x: T, y: T, min: T) {
598
    ///     assert!(x.min(y) == min);
599
    /// }
600
    ///
601
    /// check(1.0f32, 2.0, 1.0);
602
    /// check(f32::NAN, 2.0, 2.0);
603
    /// check(1.0f64, -2.0, -2.0);
604
    /// check(1.0f64, f64::NAN, 1.0);
605
    /// ```
606
    #[inline]
607
0
    fn min(self, other: Self) -> Self {
608
0
        if self.is_nan() {
609
0
            return other;
610
0
        }
611
0
        if other.is_nan() {
612
0
            return self;
613
0
        }
614
0
        if self < other {
615
0
            self
616
        } else {
617
0
            other
618
        }
619
0
    }
620
621
    /// Returns the maximum of the two numbers.
622
    ///
623
    /// If one of the arguments is NaN, then the other argument is returned.
624
    ///
625
    /// # Examples
626
    ///
627
    /// ```
628
    /// use num_traits::float::FloatCore;
629
    /// use std::{f32, f64};
630
    ///
631
    /// fn check<T: FloatCore>(x: T, y: T, max: T) {
632
    ///     assert!(x.max(y) == max);
633
    /// }
634
    ///
635
    /// check(1.0f32, 2.0, 2.0);
636
    /// check(1.0f32, f32::NAN, 1.0);
637
    /// check(-1.0f64, 2.0, 2.0);
638
    /// check(-1.0f64, f64::NAN, -1.0);
639
    /// ```
640
    #[inline]
641
0
    fn max(self, other: Self) -> Self {
642
0
        if self.is_nan() {
643
0
            return other;
644
0
        }
645
0
        if other.is_nan() {
646
0
            return self;
647
0
        }
648
0
        if self > other {
649
0
            self
650
        } else {
651
0
            other
652
        }
653
0
    }
654
655
    /// A value bounded by a minimum and a maximum
656
    ///
657
    ///  If input is less than min then this returns min.
658
    ///  If input is greater than max then this returns max.
659
    ///  Otherwise this returns input.
660
    ///
661
    /// **Panics** in debug mode if `!(min <= max)`.
662
    ///
663
    /// # Examples
664
    ///
665
    /// ```
666
    /// use num_traits::float::FloatCore;
667
    ///
668
    /// fn check<T: FloatCore>(val: T, min: T, max: T, expected: T) {
669
    ///     assert!(val.clamp(min, max) == expected);
670
    /// }
671
    ///
672
    ///
673
    /// check(1.0f32, 0.0, 2.0, 1.0);
674
    /// check(1.0f32, 2.0, 3.0, 2.0);
675
    /// check(3.0f32, 0.0, 2.0, 2.0);
676
    ///
677
    /// check(1.0f64, 0.0, 2.0, 1.0);
678
    /// check(1.0f64, 2.0, 3.0, 2.0);
679
    /// check(3.0f64, 0.0, 2.0, 2.0);
680
    /// ```
681
0
    fn clamp(self, min: Self, max: Self) -> Self {
682
0
        crate::clamp(self, min, max)
683
0
    }
684
685
    /// Returns the reciprocal (multiplicative inverse) of the number.
686
    ///
687
    /// # Examples
688
    ///
689
    /// ```
690
    /// use num_traits::float::FloatCore;
691
    /// use std::{f32, f64};
692
    ///
693
    /// fn check<T: FloatCore>(x: T, y: T) {
694
    ///     assert!(x.recip() == y);
695
    ///     assert!(y.recip() == x);
696
    /// }
697
    ///
698
    /// check(f32::INFINITY, 0.0);
699
    /// check(2.0f32, 0.5);
700
    /// check(-0.25f64, -4.0);
701
    /// check(-0.0f64, f64::NEG_INFINITY);
702
    /// ```
703
    #[inline]
704
0
    fn recip(self) -> Self {
705
0
        Self::one() / self
706
0
    }
707
708
    /// Raise a number to an integer power.
709
    ///
710
    /// Using this function is generally faster than using `powf`
711
    ///
712
    /// # Examples
713
    ///
714
    /// ```
715
    /// use num_traits::float::FloatCore;
716
    ///
717
    /// fn check<T: FloatCore>(x: T, exp: i32, powi: T) {
718
    ///     assert!(x.powi(exp) == powi);
719
    /// }
720
    ///
721
    /// check(9.0f32, 2, 81.0);
722
    /// check(1.0f32, -2, 1.0);
723
    /// check(10.0f64, 20, 1e20);
724
    /// check(4.0f64, -2, 0.0625);
725
    /// check(-1.0f64, std::i32::MIN, 1.0);
726
    /// ```
727
    #[inline]
728
0
    fn powi(mut self, mut exp: i32) -> Self {
729
0
        if exp < 0 {
730
0
            exp = exp.wrapping_neg();
731
0
            self = self.recip();
732
0
        }
733
        // It should always be possible to convert a positive `i32` to a `usize`.
734
        // Note, `i32::MIN` will wrap and still be negative, so we need to convert
735
        // to `u32` without sign-extension before growing to `usize`.
736
0
        super::pow(self, (exp as u32).to_usize().unwrap())
737
0
    }
738
739
    /// Converts to degrees, assuming the number is in radians.
740
    ///
741
    /// # Examples
742
    ///
743
    /// ```
744
    /// use num_traits::float::FloatCore;
745
    /// use std::{f32, f64};
746
    ///
747
    /// fn check<T: FloatCore>(rad: T, deg: T) {
748
    ///     assert!(rad.to_degrees() == deg);
749
    /// }
750
    ///
751
    /// check(0.0f32, 0.0);
752
    /// check(f32::consts::PI, 180.0);
753
    /// check(f64::consts::FRAC_PI_4, 45.0);
754
    /// check(f64::INFINITY, f64::INFINITY);
755
    /// ```
756
    fn to_degrees(self) -> Self;
757
758
    /// Converts to radians, assuming the number is in degrees.
759
    ///
760
    /// # Examples
761
    ///
762
    /// ```
763
    /// use num_traits::float::FloatCore;
764
    /// use std::{f32, f64};
765
    ///
766
    /// fn check<T: FloatCore>(deg: T, rad: T) {
767
    ///     assert!(deg.to_radians() == rad);
768
    /// }
769
    ///
770
    /// check(0.0f32, 0.0);
771
    /// check(180.0, f32::consts::PI);
772
    /// check(45.0, f64::consts::FRAC_PI_4);
773
    /// check(f64::INFINITY, f64::INFINITY);
774
    /// ```
775
    fn to_radians(self) -> Self;
776
777
    /// Returns the mantissa, base 2 exponent, and sign as integers, respectively.
778
    /// The original number can be recovered by `sign * mantissa * 2 ^ exponent`.
779
    ///
780
    /// # Examples
781
    ///
782
    /// ```
783
    /// use num_traits::float::FloatCore;
784
    /// use std::{f32, f64};
785
    ///
786
    /// fn check<T: FloatCore>(x: T, m: u64, e: i16, s:i8) {
787
    ///     let (mantissa, exponent, sign) = x.integer_decode();
788
    ///     assert_eq!(mantissa, m);
789
    ///     assert_eq!(exponent, e);
790
    ///     assert_eq!(sign, s);
791
    /// }
792
    ///
793
    /// check(2.0f32, 1 << 23, -22, 1);
794
    /// check(-2.0f32, 1 << 23, -22, -1);
795
    /// check(f32::INFINITY, 1 << 23, 105, 1);
796
    /// check(f64::NEG_INFINITY, 1 << 52, 972, -1);
797
    /// ```
798
    fn integer_decode(self) -> (u64, i16, i8);
799
}
800
801
impl FloatCore for f32 {
802
    constant! {
803
        infinity() -> f32::INFINITY;
804
        neg_infinity() -> f32::NEG_INFINITY;
805
        nan() -> f32::NAN;
806
        neg_zero() -> -0.0;
807
        min_value() -> f32::MIN;
808
        min_positive_value() -> f32::MIN_POSITIVE;
809
        epsilon() -> f32::EPSILON;
810
        max_value() -> f32::MAX;
811
    }
812
813
    #[inline]
814
0
    fn integer_decode(self) -> (u64, i16, i8) {
815
0
        integer_decode_f32(self)
816
0
    }
817
818
    forward! {
819
        Self::is_nan(self) -> bool;
820
        Self::is_infinite(self) -> bool;
821
        Self::is_finite(self) -> bool;
822
        Self::is_normal(self) -> bool;
823
        Self::is_subnormal(self) -> bool;
824
        Self::clamp(self, min: Self, max: Self) -> Self;
825
        Self::classify(self) -> FpCategory;
826
        Self::is_sign_positive(self) -> bool;
827
        Self::is_sign_negative(self) -> bool;
828
        Self::min(self, other: Self) -> Self;
829
        Self::max(self, other: Self) -> Self;
830
        Self::recip(self) -> Self;
831
        Self::to_degrees(self) -> Self;
832
        Self::to_radians(self) -> Self;
833
    }
834
835
    #[cfg(feature = "std")]
836
    forward! {
837
        Self::floor(self) -> Self;
838
        Self::ceil(self) -> Self;
839
        Self::round(self) -> Self;
840
        Self::trunc(self) -> Self;
841
        Self::fract(self) -> Self;
842
        Self::abs(self) -> Self;
843
        Self::signum(self) -> Self;
844
        Self::powi(self, n: i32) -> Self;
845
    }
846
847
    #[cfg(all(not(feature = "std"), feature = "libm"))]
848
    forward! {
849
        libm::floorf as floor(self) -> Self;
850
        libm::ceilf as ceil(self) -> Self;
851
        libm::roundf as round(self) -> Self;
852
        libm::truncf as trunc(self) -> Self;
853
        libm::fabsf as abs(self) -> Self;
854
    }
855
856
    #[cfg(all(not(feature = "std"), feature = "libm"))]
857
    #[inline]
858
    fn fract(self) -> Self {
859
        self - libm::truncf(self)
860
    }
861
}
862
863
impl FloatCore for f64 {
864
    constant! {
865
        infinity() -> f64::INFINITY;
866
        neg_infinity() -> f64::NEG_INFINITY;
867
        nan() -> f64::NAN;
868
        neg_zero() -> -0.0;
869
        min_value() -> f64::MIN;
870
        min_positive_value() -> f64::MIN_POSITIVE;
871
        epsilon() -> f64::EPSILON;
872
        max_value() -> f64::MAX;
873
    }
874
875
    #[inline]
876
0
    fn integer_decode(self) -> (u64, i16, i8) {
877
0
        integer_decode_f64(self)
878
0
    }
879
880
    forward! {
881
        Self::is_nan(self) -> bool;
882
        Self::is_infinite(self) -> bool;
883
        Self::is_finite(self) -> bool;
884
        Self::is_normal(self) -> bool;
885
        Self::is_subnormal(self) -> bool;
886
        Self::clamp(self, min: Self, max: Self) -> Self;
887
        Self::classify(self) -> FpCategory;
888
        Self::is_sign_positive(self) -> bool;
889
        Self::is_sign_negative(self) -> bool;
890
        Self::min(self, other: Self) -> Self;
891
        Self::max(self, other: Self) -> Self;
892
        Self::recip(self) -> Self;
893
        Self::to_degrees(self) -> Self;
894
        Self::to_radians(self) -> Self;
895
    }
896
897
    #[cfg(feature = "std")]
898
    forward! {
899
        Self::floor(self) -> Self;
900
        Self::ceil(self) -> Self;
901
        Self::round(self) -> Self;
902
        Self::trunc(self) -> Self;
903
        Self::fract(self) -> Self;
904
        Self::abs(self) -> Self;
905
        Self::signum(self) -> Self;
906
        Self::powi(self, n: i32) -> Self;
907
    }
908
909
    #[cfg(all(not(feature = "std"), feature = "libm"))]
910
    forward! {
911
        libm::floor as floor(self) -> Self;
912
        libm::ceil as ceil(self) -> Self;
913
        libm::round as round(self) -> Self;
914
        libm::trunc as trunc(self) -> Self;
915
        libm::fabs as abs(self) -> Self;
916
    }
917
918
    #[cfg(all(not(feature = "std"), feature = "libm"))]
919
    #[inline]
920
    fn fract(self) -> Self {
921
        self - libm::trunc(self)
922
    }
923
}
924
925
// FIXME: these doctests aren't actually helpful, because they're using and
926
// testing the inherent methods directly, not going through `Float`.
927
928
/// Generic trait for floating point numbers
929
///
930
/// This trait is only available with the `std` feature, or with the `libm` feature otherwise.
931
#[cfg(any(feature = "std", feature = "libm"))]
932
pub trait Float: Num + Copy + NumCast + PartialOrd + Neg<Output = Self> {
933
    /// Returns the `NaN` value.
934
    ///
935
    /// ```
936
    /// use num_traits::Float;
937
    ///
938
    /// let nan: f32 = Float::nan();
939
    ///
940
    /// assert!(nan.is_nan());
941
    /// ```
942
    fn nan() -> Self;
943
    /// Returns the infinite value.
944
    ///
945
    /// ```
946
    /// use num_traits::Float;
947
    /// use std::f32;
948
    ///
949
    /// let infinity: f32 = Float::infinity();
950
    ///
951
    /// assert!(infinity.is_infinite());
952
    /// assert!(!infinity.is_finite());
953
    /// assert!(infinity > f32::MAX);
954
    /// ```
955
    fn infinity() -> Self;
956
    /// Returns the negative infinite value.
957
    ///
958
    /// ```
959
    /// use num_traits::Float;
960
    /// use std::f32;
961
    ///
962
    /// let neg_infinity: f32 = Float::neg_infinity();
963
    ///
964
    /// assert!(neg_infinity.is_infinite());
965
    /// assert!(!neg_infinity.is_finite());
966
    /// assert!(neg_infinity < f32::MIN);
967
    /// ```
968
    fn neg_infinity() -> Self;
969
    /// Returns `-0.0`.
970
    ///
971
    /// ```
972
    /// use num_traits::{Zero, Float};
973
    ///
974
    /// let inf: f32 = Float::infinity();
975
    /// let zero: f32 = Zero::zero();
976
    /// let neg_zero: f32 = Float::neg_zero();
977
    ///
978
    /// assert_eq!(zero, neg_zero);
979
    /// assert_eq!(7.0f32/inf, zero);
980
    /// assert_eq!(zero * 10.0, zero);
981
    /// ```
982
    fn neg_zero() -> Self;
983
984
    /// Returns the smallest finite value that this type can represent.
985
    ///
986
    /// ```
987
    /// use num_traits::Float;
988
    /// use std::f64;
989
    ///
990
    /// let x: f64 = Float::min_value();
991
    ///
992
    /// assert_eq!(x, f64::MIN);
993
    /// ```
994
    fn min_value() -> Self;
995
996
    /// Returns the smallest positive, normalized value that this type can represent.
997
    ///
998
    /// ```
999
    /// use num_traits::Float;
1000
    /// use std::f64;
1001
    ///
1002
    /// let x: f64 = Float::min_positive_value();
1003
    ///
1004
    /// assert_eq!(x, f64::MIN_POSITIVE);
1005
    /// ```
1006
    fn min_positive_value() -> Self;
1007
1008
    /// Returns epsilon, a small positive value.
1009
    ///
1010
    /// ```
1011
    /// use num_traits::Float;
1012
    /// use std::f64;
1013
    ///
1014
    /// let x: f64 = Float::epsilon();
1015
    ///
1016
    /// assert_eq!(x, f64::EPSILON);
1017
    /// ```
1018
    ///
1019
    /// # Panics
1020
    ///
1021
    /// The default implementation will panic if `f32::EPSILON` cannot
1022
    /// be cast to `Self`.
1023
    fn epsilon() -> Self {
1024
        Self::from(f32::EPSILON).expect("Unable to cast from f32::EPSILON")
1025
    }
1026
1027
    /// Returns the largest finite value that this type can represent.
1028
    ///
1029
    /// ```
1030
    /// use num_traits::Float;
1031
    /// use std::f64;
1032
    ///
1033
    /// let x: f64 = Float::max_value();
1034
    /// assert_eq!(x, f64::MAX);
1035
    /// ```
1036
    fn max_value() -> Self;
1037
1038
    /// Returns `true` if this value is `NaN` and false otherwise.
1039
    ///
1040
    /// ```
1041
    /// use num_traits::Float;
1042
    /// use std::f64;
1043
    ///
1044
    /// let nan = f64::NAN;
1045
    /// let f = 7.0;
1046
    ///
1047
    /// assert!(nan.is_nan());
1048
    /// assert!(!f.is_nan());
1049
    /// ```
1050
    fn is_nan(self) -> bool;
1051
1052
    /// Returns `true` if this value is positive infinity or negative infinity and
1053
    /// false otherwise.
1054
    ///
1055
    /// ```
1056
    /// use num_traits::Float;
1057
    /// use std::f32;
1058
    ///
1059
    /// let f = 7.0f32;
1060
    /// let inf: f32 = Float::infinity();
1061
    /// let neg_inf: f32 = Float::neg_infinity();
1062
    /// let nan: f32 = f32::NAN;
1063
    ///
1064
    /// assert!(!f.is_infinite());
1065
    /// assert!(!nan.is_infinite());
1066
    ///
1067
    /// assert!(inf.is_infinite());
1068
    /// assert!(neg_inf.is_infinite());
1069
    /// ```
1070
    fn is_infinite(self) -> bool;
1071
1072
    /// Returns `true` if this number is neither infinite nor `NaN`.
1073
    ///
1074
    /// ```
1075
    /// use num_traits::Float;
1076
    /// use std::f32;
1077
    ///
1078
    /// let f = 7.0f32;
1079
    /// let inf: f32 = Float::infinity();
1080
    /// let neg_inf: f32 = Float::neg_infinity();
1081
    /// let nan: f32 = f32::NAN;
1082
    ///
1083
    /// assert!(f.is_finite());
1084
    ///
1085
    /// assert!(!nan.is_finite());
1086
    /// assert!(!inf.is_finite());
1087
    /// assert!(!neg_inf.is_finite());
1088
    /// ```
1089
    fn is_finite(self) -> bool;
1090
1091
    /// Returns `true` if the number is neither zero, infinite,
1092
    /// [subnormal][subnormal], or `NaN`.
1093
    ///
1094
    /// ```
1095
    /// use num_traits::Float;
1096
    /// use std::f32;
1097
    ///
1098
    /// let min = f32::MIN_POSITIVE; // 1.17549435e-38f32
1099
    /// let max = f32::MAX;
1100
    /// let lower_than_min = 1.0e-40_f32;
1101
    /// let zero = 0.0f32;
1102
    ///
1103
    /// assert!(min.is_normal());
1104
    /// assert!(max.is_normal());
1105
    ///
1106
    /// assert!(!zero.is_normal());
1107
    /// assert!(!f32::NAN.is_normal());
1108
    /// assert!(!f32::INFINITY.is_normal());
1109
    /// // Values between `0` and `min` are Subnormal.
1110
    /// assert!(!lower_than_min.is_normal());
1111
    /// ```
1112
    /// [subnormal]: http://en.wikipedia.org/wiki/Subnormal_number
1113
    fn is_normal(self) -> bool;
1114
1115
    /// Returns `true` if the number is [subnormal].
1116
    ///
1117
    /// ```
1118
    /// use num_traits::Float;
1119
    /// use std::f64;
1120
    ///
1121
    /// let min = f64::MIN_POSITIVE; // 2.2250738585072014e-308_f64
1122
    /// let max = f64::MAX;
1123
    /// let lower_than_min = 1.0e-308_f64;
1124
    /// let zero = 0.0_f64;
1125
    ///
1126
    /// assert!(!min.is_subnormal());
1127
    /// assert!(!max.is_subnormal());
1128
    ///
1129
    /// assert!(!zero.is_subnormal());
1130
    /// assert!(!f64::NAN.is_subnormal());
1131
    /// assert!(!f64::INFINITY.is_subnormal());
1132
    /// // Values between `0` and `min` are Subnormal.
1133
    /// assert!(lower_than_min.is_subnormal());
1134
    /// ```
1135
    /// [subnormal]: https://en.wikipedia.org/wiki/Subnormal_number
1136
    #[inline]
1137
    fn is_subnormal(self) -> bool {
1138
        self.classify() == FpCategory::Subnormal
1139
    }
1140
1141
    /// Returns the floating point category of the number. If only one property
1142
    /// is going to be tested, it is generally faster to use the specific
1143
    /// predicate instead.
1144
    ///
1145
    /// ```
1146
    /// use num_traits::Float;
1147
    /// use std::num::FpCategory;
1148
    /// use std::f32;
1149
    ///
1150
    /// let num = 12.4f32;
1151
    /// let inf = f32::INFINITY;
1152
    ///
1153
    /// assert_eq!(num.classify(), FpCategory::Normal);
1154
    /// assert_eq!(inf.classify(), FpCategory::Infinite);
1155
    /// ```
1156
    fn classify(self) -> FpCategory;
1157
1158
    /// Returns the largest integer less than or equal to a number.
1159
    ///
1160
    /// ```
1161
    /// use num_traits::Float;
1162
    ///
1163
    /// let f = 3.99;
1164
    /// let g = 3.0;
1165
    ///
1166
    /// assert_eq!(f.floor(), 3.0);
1167
    /// assert_eq!(g.floor(), 3.0);
1168
    /// ```
1169
    fn floor(self) -> Self;
1170
1171
    /// Returns the smallest integer greater than or equal to a number.
1172
    ///
1173
    /// ```
1174
    /// use num_traits::Float;
1175
    ///
1176
    /// let f = 3.01;
1177
    /// let g = 4.0;
1178
    ///
1179
    /// assert_eq!(f.ceil(), 4.0);
1180
    /// assert_eq!(g.ceil(), 4.0);
1181
    /// ```
1182
    fn ceil(self) -> Self;
1183
1184
    /// Returns the nearest integer to a number. Round half-way cases away from
1185
    /// `0.0`.
1186
    ///
1187
    /// ```
1188
    /// use num_traits::Float;
1189
    ///
1190
    /// let f = 3.3;
1191
    /// let g = -3.3;
1192
    ///
1193
    /// assert_eq!(f.round(), 3.0);
1194
    /// assert_eq!(g.round(), -3.0);
1195
    /// ```
1196
    fn round(self) -> Self;
1197
1198
    /// Return the integer part of a number.
1199
    ///
1200
    /// ```
1201
    /// use num_traits::Float;
1202
    ///
1203
    /// let f = 3.3;
1204
    /// let g = -3.7;
1205
    ///
1206
    /// assert_eq!(f.trunc(), 3.0);
1207
    /// assert_eq!(g.trunc(), -3.0);
1208
    /// ```
1209
    fn trunc(self) -> Self;
1210
1211
    /// Returns the fractional part of a number.
1212
    ///
1213
    /// ```
1214
    /// use num_traits::Float;
1215
    ///
1216
    /// let x = 3.5;
1217
    /// let y = -3.5;
1218
    /// let abs_difference_x = (x.fract() - 0.5).abs();
1219
    /// let abs_difference_y = (y.fract() - (-0.5)).abs();
1220
    ///
1221
    /// assert!(abs_difference_x < 1e-10);
1222
    /// assert!(abs_difference_y < 1e-10);
1223
    /// ```
1224
    fn fract(self) -> Self;
1225
1226
    /// Computes the absolute value of `self`. Returns `Float::nan()` if the
1227
    /// number is `Float::nan()`.
1228
    ///
1229
    /// ```
1230
    /// use num_traits::Float;
1231
    /// use std::f64;
1232
    ///
1233
    /// let x = 3.5;
1234
    /// let y = -3.5;
1235
    ///
1236
    /// let abs_difference_x = (x.abs() - x).abs();
1237
    /// let abs_difference_y = (y.abs() - (-y)).abs();
1238
    ///
1239
    /// assert!(abs_difference_x < 1e-10);
1240
    /// assert!(abs_difference_y < 1e-10);
1241
    ///
1242
    /// assert!(f64::NAN.abs().is_nan());
1243
    /// ```
1244
    fn abs(self) -> Self;
1245
1246
    /// Returns a number that represents the sign of `self`.
1247
    ///
1248
    /// - `1.0` if the number is positive, `+0.0` or `Float::infinity()`
1249
    /// - `-1.0` if the number is negative, `-0.0` or `Float::neg_infinity()`
1250
    /// - `Float::nan()` if the number is `Float::nan()`
1251
    ///
1252
    /// ```
1253
    /// use num_traits::Float;
1254
    /// use std::f64;
1255
    ///
1256
    /// let f = 3.5;
1257
    ///
1258
    /// assert_eq!(f.signum(), 1.0);
1259
    /// assert_eq!(f64::NEG_INFINITY.signum(), -1.0);
1260
    ///
1261
    /// assert!(f64::NAN.signum().is_nan());
1262
    /// ```
1263
    fn signum(self) -> Self;
1264
1265
    /// Returns `true` if `self` is positive, including `+0.0`,
1266
    /// `Float::infinity()`, and `Float::nan()`.
1267
    ///
1268
    /// ```
1269
    /// use num_traits::Float;
1270
    /// use std::f64;
1271
    ///
1272
    /// let nan: f64 = f64::NAN;
1273
    /// let neg_nan: f64 = -f64::NAN;
1274
    ///
1275
    /// let f = 7.0;
1276
    /// let g = -7.0;
1277
    ///
1278
    /// assert!(f.is_sign_positive());
1279
    /// assert!(!g.is_sign_positive());
1280
    /// assert!(nan.is_sign_positive());
1281
    /// assert!(!neg_nan.is_sign_positive());
1282
    /// ```
1283
    fn is_sign_positive(self) -> bool;
1284
1285
    /// Returns `true` if `self` is negative, including `-0.0`,
1286
    /// `Float::neg_infinity()`, and `-Float::nan()`.
1287
    ///
1288
    /// ```
1289
    /// use num_traits::Float;
1290
    /// use std::f64;
1291
    ///
1292
    /// let nan: f64 = f64::NAN;
1293
    /// let neg_nan: f64 = -f64::NAN;
1294
    ///
1295
    /// let f = 7.0;
1296
    /// let g = -7.0;
1297
    ///
1298
    /// assert!(!f.is_sign_negative());
1299
    /// assert!(g.is_sign_negative());
1300
    /// assert!(!nan.is_sign_negative());
1301
    /// assert!(neg_nan.is_sign_negative());
1302
    /// ```
1303
    fn is_sign_negative(self) -> bool;
1304
1305
    /// Fused multiply-add. Computes `(self * a) + b` with only one rounding
1306
    /// error, yielding a more accurate result than an unfused multiply-add.
1307
    ///
1308
    /// Using `mul_add` can be more performant than an unfused multiply-add if
1309
    /// the target architecture has a dedicated `fma` CPU instruction.
1310
    ///
1311
    /// ```
1312
    /// use num_traits::Float;
1313
    ///
1314
    /// let m = 10.0;
1315
    /// let x = 4.0;
1316
    /// let b = 60.0;
1317
    ///
1318
    /// // 100.0
1319
    /// let abs_difference = (m.mul_add(x, b) - (m*x + b)).abs();
1320
    ///
1321
    /// assert!(abs_difference < 1e-10);
1322
    /// ```
1323
    fn mul_add(self, a: Self, b: Self) -> Self;
1324
    /// Take the reciprocal (inverse) of a number, `1/x`.
1325
    ///
1326
    /// ```
1327
    /// use num_traits::Float;
1328
    ///
1329
    /// let x = 2.0;
1330
    /// let abs_difference = (x.recip() - (1.0/x)).abs();
1331
    ///
1332
    /// assert!(abs_difference < 1e-10);
1333
    /// ```
1334
    fn recip(self) -> Self;
1335
1336
    /// Raise a number to an integer power.
1337
    ///
1338
    /// Using this function is generally faster than using `powf`
1339
    ///
1340
    /// ```
1341
    /// use num_traits::Float;
1342
    ///
1343
    /// let x = 2.0;
1344
    /// let abs_difference = (x.powi(2) - x*x).abs();
1345
    ///
1346
    /// assert!(abs_difference < 1e-10);
1347
    /// ```
1348
    fn powi(self, n: i32) -> Self;
1349
1350
    /// Raise a number to a floating point power.
1351
    ///
1352
    /// ```
1353
    /// use num_traits::Float;
1354
    ///
1355
    /// let x = 2.0;
1356
    /// let abs_difference = (x.powf(2.0) - x*x).abs();
1357
    ///
1358
    /// assert!(abs_difference < 1e-10);
1359
    /// ```
1360
    fn powf(self, n: Self) -> Self;
1361
1362
    /// Take the square root of a number.
1363
    ///
1364
    /// Returns NaN if `self` is a negative number.
1365
    ///
1366
    /// ```
1367
    /// use num_traits::Float;
1368
    ///
1369
    /// let positive = 4.0;
1370
    /// let negative = -4.0;
1371
    ///
1372
    /// let abs_difference = (positive.sqrt() - 2.0).abs();
1373
    ///
1374
    /// assert!(abs_difference < 1e-10);
1375
    /// assert!(negative.sqrt().is_nan());
1376
    /// ```
1377
    fn sqrt(self) -> Self;
1378
1379
    /// Returns `e^(self)`, (the exponential function).
1380
    ///
1381
    /// ```
1382
    /// use num_traits::Float;
1383
    ///
1384
    /// let one = 1.0;
1385
    /// // e^1
1386
    /// let e = one.exp();
1387
    ///
1388
    /// // ln(e) - 1 == 0
1389
    /// let abs_difference = (e.ln() - 1.0).abs();
1390
    ///
1391
    /// assert!(abs_difference < 1e-10);
1392
    /// ```
1393
    fn exp(self) -> Self;
1394
1395
    /// Returns `2^(self)`.
1396
    ///
1397
    /// ```
1398
    /// use num_traits::Float;
1399
    ///
1400
    /// let f = 2.0;
1401
    ///
1402
    /// // 2^2 - 4 == 0
1403
    /// let abs_difference = (f.exp2() - 4.0).abs();
1404
    ///
1405
    /// assert!(abs_difference < 1e-10);
1406
    /// ```
1407
    fn exp2(self) -> Self;
1408
1409
    /// Returns the natural logarithm of the number.
1410
    ///
1411
    /// ```
1412
    /// use num_traits::Float;
1413
    ///
1414
    /// let one = 1.0;
1415
    /// // e^1
1416
    /// let e = one.exp();
1417
    ///
1418
    /// // ln(e) - 1 == 0
1419
    /// let abs_difference = (e.ln() - 1.0).abs();
1420
    ///
1421
    /// assert!(abs_difference < 1e-10);
1422
    /// ```
1423
    fn ln(self) -> Self;
1424
1425
    /// Returns the logarithm of the number with respect to an arbitrary base.
1426
    ///
1427
    /// ```
1428
    /// use num_traits::Float;
1429
    ///
1430
    /// let ten = 10.0;
1431
    /// let two = 2.0;
1432
    ///
1433
    /// // log10(10) - 1 == 0
1434
    /// let abs_difference_10 = (ten.log(10.0) - 1.0).abs();
1435
    ///
1436
    /// // log2(2) - 1 == 0
1437
    /// let abs_difference_2 = (two.log(2.0) - 1.0).abs();
1438
    ///
1439
    /// assert!(abs_difference_10 < 1e-10);
1440
    /// assert!(abs_difference_2 < 1e-10);
1441
    /// ```
1442
    fn log(self, base: Self) -> Self;
1443
1444
    /// Returns the base 2 logarithm of the number.
1445
    ///
1446
    /// ```
1447
    /// use num_traits::Float;
1448
    ///
1449
    /// let two = 2.0;
1450
    ///
1451
    /// // log2(2) - 1 == 0
1452
    /// let abs_difference = (two.log2() - 1.0).abs();
1453
    ///
1454
    /// assert!(abs_difference < 1e-10);
1455
    /// ```
1456
    fn log2(self) -> Self;
1457
1458
    /// Returns the base 10 logarithm of the number.
1459
    ///
1460
    /// ```
1461
    /// use num_traits::Float;
1462
    ///
1463
    /// let ten = 10.0;
1464
    ///
1465
    /// // log10(10) - 1 == 0
1466
    /// let abs_difference = (ten.log10() - 1.0).abs();
1467
    ///
1468
    /// assert!(abs_difference < 1e-10);
1469
    /// ```
1470
    fn log10(self) -> Self;
1471
1472
    /// Converts radians to degrees.
1473
    ///
1474
    /// ```
1475
    /// use std::f64::consts;
1476
    ///
1477
    /// let angle = consts::PI;
1478
    ///
1479
    /// let abs_difference = (angle.to_degrees() - 180.0).abs();
1480
    ///
1481
    /// assert!(abs_difference < 1e-10);
1482
    /// ```
1483
    #[inline]
1484
    fn to_degrees(self) -> Self {
1485
        let halfpi = Self::zero().acos();
1486
        let ninety = Self::from(90u8).unwrap();
1487
        self * ninety / halfpi
1488
    }
1489
1490
    /// Converts degrees to radians.
1491
    ///
1492
    /// ```
1493
    /// use std::f64::consts;
1494
    ///
1495
    /// let angle = 180.0_f64;
1496
    ///
1497
    /// let abs_difference = (angle.to_radians() - consts::PI).abs();
1498
    ///
1499
    /// assert!(abs_difference < 1e-10);
1500
    /// ```
1501
    #[inline]
1502
    fn to_radians(self) -> Self {
1503
        let halfpi = Self::zero().acos();
1504
        let ninety = Self::from(90u8).unwrap();
1505
        self * halfpi / ninety
1506
    }
1507
1508
    /// Returns the maximum of the two numbers.
1509
    ///
1510
    /// ```
1511
    /// use num_traits::Float;
1512
    ///
1513
    /// let x = 1.0;
1514
    /// let y = 2.0;
1515
    ///
1516
    /// assert_eq!(x.max(y), y);
1517
    /// ```
1518
    fn max(self, other: Self) -> Self;
1519
1520
    /// Returns the minimum of the two numbers.
1521
    ///
1522
    /// ```
1523
    /// use num_traits::Float;
1524
    ///
1525
    /// let x = 1.0;
1526
    /// let y = 2.0;
1527
    ///
1528
    /// assert_eq!(x.min(y), x);
1529
    /// ```
1530
    fn min(self, other: Self) -> Self;
1531
1532
    /// Clamps a value between a min and max.
1533
    ///
1534
    /// **Panics** in debug mode if `!(min <= max)`.
1535
    ///
1536
    /// ```
1537
    /// use num_traits::Float;
1538
    ///
1539
    /// let x = 1.0;
1540
    /// let y = 2.0;
1541
    /// let z = 3.0;
1542
    ///
1543
    /// assert_eq!(x.clamp(y, z), 2.0);
1544
    /// ```
1545
    fn clamp(self, min: Self, max: Self) -> Self {
1546
        crate::clamp(self, min, max)
1547
    }
1548
1549
    /// The positive difference of two numbers.
1550
    ///
1551
    /// * If `self <= other`: `0:0`
1552
    /// * Else: `self - other`
1553
    ///
1554
    /// ```
1555
    /// use num_traits::Float;
1556
    ///
1557
    /// let x = 3.0;
1558
    /// let y = -3.0;
1559
    ///
1560
    /// let abs_difference_x = (x.abs_sub(1.0) - 2.0).abs();
1561
    /// let abs_difference_y = (y.abs_sub(1.0) - 0.0).abs();
1562
    ///
1563
    /// assert!(abs_difference_x < 1e-10);
1564
    /// assert!(abs_difference_y < 1e-10);
1565
    /// ```
1566
    fn abs_sub(self, other: Self) -> Self;
1567
1568
    /// Take the cubic root of a number.
1569
    ///
1570
    /// ```
1571
    /// use num_traits::Float;
1572
    ///
1573
    /// let x = 8.0;
1574
    ///
1575
    /// // x^(1/3) - 2 == 0
1576
    /// let abs_difference = (x.cbrt() - 2.0).abs();
1577
    ///
1578
    /// assert!(abs_difference < 1e-10);
1579
    /// ```
1580
    fn cbrt(self) -> Self;
1581
1582
    /// Calculate the length of the hypotenuse of a right-angle triangle given
1583
    /// legs of length `x` and `y`.
1584
    ///
1585
    /// ```
1586
    /// use num_traits::Float;
1587
    ///
1588
    /// let x = 2.0;
1589
    /// let y = 3.0;
1590
    ///
1591
    /// // sqrt(x^2 + y^2)
1592
    /// let abs_difference = (x.hypot(y) - (x.powi(2) + y.powi(2)).sqrt()).abs();
1593
    ///
1594
    /// assert!(abs_difference < 1e-10);
1595
    /// ```
1596
    fn hypot(self, other: Self) -> Self;
1597
1598
    /// Computes the sine of a number (in radians).
1599
    ///
1600
    /// ```
1601
    /// use num_traits::Float;
1602
    /// use std::f64;
1603
    ///
1604
    /// let x = f64::consts::PI/2.0;
1605
    ///
1606
    /// let abs_difference = (x.sin() - 1.0).abs();
1607
    ///
1608
    /// assert!(abs_difference < 1e-10);
1609
    /// ```
1610
    fn sin(self) -> Self;
1611
1612
    /// Computes the cosine of a number (in radians).
1613
    ///
1614
    /// ```
1615
    /// use num_traits::Float;
1616
    /// use std::f64;
1617
    ///
1618
    /// let x = 2.0*f64::consts::PI;
1619
    ///
1620
    /// let abs_difference = (x.cos() - 1.0).abs();
1621
    ///
1622
    /// assert!(abs_difference < 1e-10);
1623
    /// ```
1624
    fn cos(self) -> Self;
1625
1626
    /// Computes the tangent of a number (in radians).
1627
    ///
1628
    /// ```
1629
    /// use num_traits::Float;
1630
    /// use std::f64;
1631
    ///
1632
    /// let x = f64::consts::PI/4.0;
1633
    /// let abs_difference = (x.tan() - 1.0).abs();
1634
    ///
1635
    /// assert!(abs_difference < 1e-14);
1636
    /// ```
1637
    fn tan(self) -> Self;
1638
1639
    /// Computes the arcsine of a number. Return value is in radians in
1640
    /// the range [-pi/2, pi/2] or NaN if the number is outside the range
1641
    /// [-1, 1].
1642
    ///
1643
    /// ```
1644
    /// use num_traits::Float;
1645
    /// use std::f64;
1646
    ///
1647
    /// let f = f64::consts::PI / 2.0;
1648
    ///
1649
    /// // asin(sin(pi/2))
1650
    /// let abs_difference = (f.sin().asin() - f64::consts::PI / 2.0).abs();
1651
    ///
1652
    /// assert!(abs_difference < 1e-10);
1653
    /// ```
1654
    fn asin(self) -> Self;
1655
1656
    /// Computes the arccosine of a number. Return value is in radians in
1657
    /// the range [0, pi] or NaN if the number is outside the range
1658
    /// [-1, 1].
1659
    ///
1660
    /// ```
1661
    /// use num_traits::Float;
1662
    /// use std::f64;
1663
    ///
1664
    /// let f = f64::consts::PI / 4.0;
1665
    ///
1666
    /// // acos(cos(pi/4))
1667
    /// let abs_difference = (f.cos().acos() - f64::consts::PI / 4.0).abs();
1668
    ///
1669
    /// assert!(abs_difference < 1e-10);
1670
    /// ```
1671
    fn acos(self) -> Self;
1672
1673
    /// Computes the arctangent of a number. Return value is in radians in the
1674
    /// range [-pi/2, pi/2];
1675
    ///
1676
    /// ```
1677
    /// use num_traits::Float;
1678
    ///
1679
    /// let f = 1.0;
1680
    ///
1681
    /// // atan(tan(1))
1682
    /// let abs_difference = (f.tan().atan() - 1.0).abs();
1683
    ///
1684
    /// assert!(abs_difference < 1e-10);
1685
    /// ```
1686
    fn atan(self) -> Self;
1687
1688
    /// Computes the four quadrant arctangent of `self` (`y`) and `other` (`x`).
1689
    ///
1690
    /// * `x = 0`, `y = 0`: `0`
1691
    /// * `x >= 0`: `arctan(y/x)` -> `[-pi/2, pi/2]`
1692
    /// * `y >= 0`: `arctan(y/x) + pi` -> `(pi/2, pi]`
1693
    /// * `y < 0`: `arctan(y/x) - pi` -> `(-pi, -pi/2)`
1694
    ///
1695
    /// ```
1696
    /// use num_traits::Float;
1697
    /// use std::f64;
1698
    ///
1699
    /// let pi = f64::consts::PI;
1700
    /// // All angles from horizontal right (+x)
1701
    /// // 45 deg counter-clockwise
1702
    /// let x1 = 3.0;
1703
    /// let y1 = -3.0;
1704
    ///
1705
    /// // 135 deg clockwise
1706
    /// let x2 = -3.0;
1707
    /// let y2 = 3.0;
1708
    ///
1709
    /// let abs_difference_1 = (y1.atan2(x1) - (-pi/4.0)).abs();
1710
    /// let abs_difference_2 = (y2.atan2(x2) - 3.0*pi/4.0).abs();
1711
    ///
1712
    /// assert!(abs_difference_1 < 1e-10);
1713
    /// assert!(abs_difference_2 < 1e-10);
1714
    /// ```
1715
    fn atan2(self, other: Self) -> Self;
1716
1717
    /// Simultaneously computes the sine and cosine of the number, `x`. Returns
1718
    /// `(sin(x), cos(x))`.
1719
    ///
1720
    /// ```
1721
    /// use num_traits::Float;
1722
    /// use std::f64;
1723
    ///
1724
    /// let x = f64::consts::PI/4.0;
1725
    /// let f = x.sin_cos();
1726
    ///
1727
    /// let abs_difference_0 = (f.0 - x.sin()).abs();
1728
    /// let abs_difference_1 = (f.1 - x.cos()).abs();
1729
    ///
1730
    /// assert!(abs_difference_0 < 1e-10);
1731
    /// assert!(abs_difference_0 < 1e-10);
1732
    /// ```
1733
    fn sin_cos(self) -> (Self, Self);
1734
1735
    /// Returns `e^(self) - 1` in a way that is accurate even if the
1736
    /// number is close to zero.
1737
    ///
1738
    /// ```
1739
    /// use num_traits::Float;
1740
    ///
1741
    /// let x = 7.0;
1742
    ///
1743
    /// // e^(ln(7)) - 1
1744
    /// let abs_difference = (x.ln().exp_m1() - 6.0).abs();
1745
    ///
1746
    /// assert!(abs_difference < 1e-10);
1747
    /// ```
1748
    fn exp_m1(self) -> Self;
1749
1750
    /// Returns `ln(1+n)` (natural logarithm) more accurately than if
1751
    /// the operations were performed separately.
1752
    ///
1753
    /// ```
1754
    /// use num_traits::Float;
1755
    /// use std::f64;
1756
    ///
1757
    /// let x = f64::consts::E - 1.0;
1758
    ///
1759
    /// // ln(1 + (e - 1)) == ln(e) == 1
1760
    /// let abs_difference = (x.ln_1p() - 1.0).abs();
1761
    ///
1762
    /// assert!(abs_difference < 1e-10);
1763
    /// ```
1764
    fn ln_1p(self) -> Self;
1765
1766
    /// Hyperbolic sine function.
1767
    ///
1768
    /// ```
1769
    /// use num_traits::Float;
1770
    /// use std::f64;
1771
    ///
1772
    /// let e = f64::consts::E;
1773
    /// let x = 1.0;
1774
    ///
1775
    /// let f = x.sinh();
1776
    /// // Solving sinh() at 1 gives `(e^2-1)/(2e)`
1777
    /// let g = (e*e - 1.0)/(2.0*e);
1778
    /// let abs_difference = (f - g).abs();
1779
    ///
1780
    /// assert!(abs_difference < 1e-10);
1781
    /// ```
1782
    fn sinh(self) -> Self;
1783
1784
    /// Hyperbolic cosine function.
1785
    ///
1786
    /// ```
1787
    /// use num_traits::Float;
1788
    /// use std::f64;
1789
    ///
1790
    /// let e = f64::consts::E;
1791
    /// let x = 1.0;
1792
    /// let f = x.cosh();
1793
    /// // Solving cosh() at 1 gives this result
1794
    /// let g = (e*e + 1.0)/(2.0*e);
1795
    /// let abs_difference = (f - g).abs();
1796
    ///
1797
    /// // Same result
1798
    /// assert!(abs_difference < 1.0e-10);
1799
    /// ```
1800
    fn cosh(self) -> Self;
1801
1802
    /// Hyperbolic tangent function.
1803
    ///
1804
    /// ```
1805
    /// use num_traits::Float;
1806
    /// use std::f64;
1807
    ///
1808
    /// let e = f64::consts::E;
1809
    /// let x = 1.0;
1810
    ///
1811
    /// let f = x.tanh();
1812
    /// // Solving tanh() at 1 gives `(1 - e^(-2))/(1 + e^(-2))`
1813
    /// let g = (1.0 - e.powi(-2))/(1.0 + e.powi(-2));
1814
    /// let abs_difference = (f - g).abs();
1815
    ///
1816
    /// assert!(abs_difference < 1.0e-10);
1817
    /// ```
1818
    fn tanh(self) -> Self;
1819
1820
    /// Inverse hyperbolic sine function.
1821
    ///
1822
    /// ```
1823
    /// use num_traits::Float;
1824
    ///
1825
    /// let x = 1.0;
1826
    /// let f = x.sinh().asinh();
1827
    ///
1828
    /// let abs_difference = (f - x).abs();
1829
    ///
1830
    /// assert!(abs_difference < 1.0e-10);
1831
    /// ```
1832
    fn asinh(self) -> Self;
1833
1834
    /// Inverse hyperbolic cosine function.
1835
    ///
1836
    /// ```
1837
    /// use num_traits::Float;
1838
    ///
1839
    /// let x = 1.0;
1840
    /// let f = x.cosh().acosh();
1841
    ///
1842
    /// let abs_difference = (f - x).abs();
1843
    ///
1844
    /// assert!(abs_difference < 1.0e-10);
1845
    /// ```
1846
    fn acosh(self) -> Self;
1847
1848
    /// Inverse hyperbolic tangent function.
1849
    ///
1850
    /// ```
1851
    /// use num_traits::Float;
1852
    /// use std::f64;
1853
    ///
1854
    /// let e = f64::consts::E;
1855
    /// let f = e.tanh().atanh();
1856
    ///
1857
    /// let abs_difference = (f - e).abs();
1858
    ///
1859
    /// assert!(abs_difference < 1.0e-10);
1860
    /// ```
1861
    fn atanh(self) -> Self;
1862
1863
    /// Returns the mantissa, base 2 exponent, and sign as integers, respectively.
1864
    /// The original number can be recovered by `sign * mantissa * 2 ^ exponent`.
1865
    ///
1866
    /// ```
1867
    /// use num_traits::Float;
1868
    ///
1869
    /// let num = 2.0f32;
1870
    ///
1871
    /// // (8388608, -22, 1)
1872
    /// let (mantissa, exponent, sign) = Float::integer_decode(num);
1873
    /// let sign_f = sign as f32;
1874
    /// let mantissa_f = mantissa as f32;
1875
    /// let exponent_f = num.powf(exponent as f32);
1876
    ///
1877
    /// // 1 * 8388608 * 2^(-22) == 2
1878
    /// let abs_difference = (sign_f * mantissa_f * exponent_f - num).abs();
1879
    ///
1880
    /// assert!(abs_difference < 1e-10);
1881
    /// ```
1882
    fn integer_decode(self) -> (u64, i16, i8);
1883
1884
    /// Returns a number composed of the magnitude of `self` and the sign of
1885
    /// `sign`.
1886
    ///
1887
    /// Equal to `self` if the sign of `self` and `sign` are the same, otherwise
1888
    /// equal to `-self`. If `self` is a `NAN`, then a `NAN` with the sign of
1889
    /// `sign` is returned.
1890
    ///
1891
    /// # Examples
1892
    ///
1893
    /// ```
1894
    /// use num_traits::Float;
1895
    ///
1896
    /// let f = 3.5_f32;
1897
    ///
1898
    /// assert_eq!(f.copysign(0.42), 3.5_f32);
1899
    /// assert_eq!(f.copysign(-0.42), -3.5_f32);
1900
    /// assert_eq!((-f).copysign(0.42), 3.5_f32);
1901
    /// assert_eq!((-f).copysign(-0.42), -3.5_f32);
1902
    ///
1903
    /// assert!(f32::nan().copysign(1.0).is_nan());
1904
    /// ```
1905
    fn copysign(self, sign: Self) -> Self {
1906
        if self.is_sign_negative() == sign.is_sign_negative() {
1907
            self
1908
        } else {
1909
            self.neg()
1910
        }
1911
    }
1912
}
1913
1914
#[cfg(feature = "std")]
1915
macro_rules! float_impl_std {
1916
    ($T:ident $decode:ident) => {
1917
        impl Float for $T {
1918
            constant! {
1919
                nan() -> $T::NAN;
1920
                infinity() -> $T::INFINITY;
1921
                neg_infinity() -> $T::NEG_INFINITY;
1922
                neg_zero() -> -0.0;
1923
                min_value() -> $T::MIN;
1924
                min_positive_value() -> $T::MIN_POSITIVE;
1925
                epsilon() -> $T::EPSILON;
1926
                max_value() -> $T::MAX;
1927
            }
1928
1929
            #[inline]
1930
            #[allow(deprecated)]
1931
            fn abs_sub(self, other: Self) -> Self {
1932
                <$T>::abs_sub(self, other)
1933
            }
1934
1935
            #[inline]
1936
            fn integer_decode(self) -> (u64, i16, i8) {
1937
                $decode(self)
1938
            }
1939
1940
            forward! {
1941
                Self::is_nan(self) -> bool;
1942
                Self::is_infinite(self) -> bool;
1943
                Self::is_finite(self) -> bool;
1944
                Self::is_normal(self) -> bool;
1945
                Self::is_subnormal(self) -> bool;
1946
                Self::classify(self) -> FpCategory;
1947
                Self::clamp(self, min: Self, max: Self) -> Self;
1948
                Self::floor(self) -> Self;
1949
                Self::ceil(self) -> Self;
1950
                Self::round(self) -> Self;
1951
                Self::trunc(self) -> Self;
1952
                Self::fract(self) -> Self;
1953
                Self::abs(self) -> Self;
1954
                Self::signum(self) -> Self;
1955
                Self::is_sign_positive(self) -> bool;
1956
                Self::is_sign_negative(self) -> bool;
1957
                Self::mul_add(self, a: Self, b: Self) -> Self;
1958
                Self::recip(self) -> Self;
1959
                Self::powi(self, n: i32) -> Self;
1960
                Self::powf(self, n: Self) -> Self;
1961
                Self::sqrt(self) -> Self;
1962
                Self::exp(self) -> Self;
1963
                Self::exp2(self) -> Self;
1964
                Self::ln(self) -> Self;
1965
                Self::log(self, base: Self) -> Self;
1966
                Self::log2(self) -> Self;
1967
                Self::log10(self) -> Self;
1968
                Self::to_degrees(self) -> Self;
1969
                Self::to_radians(self) -> Self;
1970
                Self::max(self, other: Self) -> Self;
1971
                Self::min(self, other: Self) -> Self;
1972
                Self::cbrt(self) -> Self;
1973
                Self::hypot(self, other: Self) -> Self;
1974
                Self::sin(self) -> Self;
1975
                Self::cos(self) -> Self;
1976
                Self::tan(self) -> Self;
1977
                Self::asin(self) -> Self;
1978
                Self::acos(self) -> Self;
1979
                Self::atan(self) -> Self;
1980
                Self::atan2(self, other: Self) -> Self;
1981
                Self::sin_cos(self) -> (Self, Self);
1982
                Self::exp_m1(self) -> Self;
1983
                Self::ln_1p(self) -> Self;
1984
                Self::sinh(self) -> Self;
1985
                Self::cosh(self) -> Self;
1986
                Self::tanh(self) -> Self;
1987
                Self::asinh(self) -> Self;
1988
                Self::acosh(self) -> Self;
1989
                Self::atanh(self) -> Self;
1990
                Self::copysign(self, sign: Self) -> Self;
1991
            }
1992
        }
1993
    };
1994
}
1995
1996
#[cfg(all(not(feature = "std"), feature = "libm"))]
1997
macro_rules! float_impl_libm {
1998
    ($T:ident $decode:ident) => {
1999
        constant! {
2000
            nan() -> $T::NAN;
2001
            infinity() -> $T::INFINITY;
2002
            neg_infinity() -> $T::NEG_INFINITY;
2003
            neg_zero() -> -0.0;
2004
            min_value() -> $T::MIN;
2005
            min_positive_value() -> $T::MIN_POSITIVE;
2006
            epsilon() -> $T::EPSILON;
2007
            max_value() -> $T::MAX;
2008
        }
2009
2010
        #[inline]
2011
        fn integer_decode(self) -> (u64, i16, i8) {
2012
            $decode(self)
2013
        }
2014
2015
        #[inline]
2016
        fn fract(self) -> Self {
2017
            self - Float::trunc(self)
2018
        }
2019
2020
        #[inline]
2021
        fn log(self, base: Self) -> Self {
2022
            self.ln() / base.ln()
2023
        }
2024
2025
        forward! {
2026
            Self::is_nan(self) -> bool;
2027
            Self::is_infinite(self) -> bool;
2028
            Self::is_finite(self) -> bool;
2029
            Self::is_normal(self) -> bool;
2030
            Self::is_subnormal(self) -> bool;
2031
            Self::clamp(self, min: Self, max: Self) -> Self;
2032
            Self::classify(self) -> FpCategory;
2033
            Self::is_sign_positive(self) -> bool;
2034
            Self::is_sign_negative(self) -> bool;
2035
            Self::min(self, other: Self) -> Self;
2036
            Self::max(self, other: Self) -> Self;
2037
            Self::recip(self) -> Self;
2038
            Self::to_degrees(self) -> Self;
2039
            Self::to_radians(self) -> Self;
2040
        }
2041
2042
        forward! {
2043
            FloatCore::signum(self) -> Self;
2044
            FloatCore::powi(self, n: i32) -> Self;
2045
        }
2046
    };
2047
}
2048
2049
0
fn integer_decode_f32(f: f32) -> (u64, i16, i8) {
2050
0
    let bits: u32 = f.to_bits();
2051
0
    let sign: i8 = if bits >> 31 == 0 { 1 } else { -1 };
2052
0
    let mut exponent: i16 = ((bits >> 23) & 0xff) as i16;
2053
0
    let mantissa = if exponent == 0 {
2054
0
        (bits & 0x7fffff) << 1
2055
    } else {
2056
0
        (bits & 0x7fffff) | 0x800000
2057
    };
2058
    // Exponent bias + mantissa shift
2059
0
    exponent -= 127 + 23;
2060
0
    (mantissa as u64, exponent, sign)
2061
0
}
2062
2063
0
fn integer_decode_f64(f: f64) -> (u64, i16, i8) {
2064
0
    let bits: u64 = f.to_bits();
2065
0
    let sign: i8 = if bits >> 63 == 0 { 1 } else { -1 };
2066
0
    let mut exponent: i16 = ((bits >> 52) & 0x7ff) as i16;
2067
0
    let mantissa = if exponent == 0 {
2068
0
        (bits & 0xfffffffffffff) << 1
2069
    } else {
2070
0
        (bits & 0xfffffffffffff) | 0x10000000000000
2071
    };
2072
    // Exponent bias + mantissa shift
2073
0
    exponent -= 1023 + 52;
2074
0
    (mantissa, exponent, sign)
2075
0
}
2076
2077
#[cfg(feature = "std")]
2078
float_impl_std!(f32 integer_decode_f32);
2079
#[cfg(feature = "std")]
2080
float_impl_std!(f64 integer_decode_f64);
2081
2082
#[cfg(all(not(feature = "std"), feature = "libm"))]
2083
impl Float for f32 {
2084
    float_impl_libm!(f32 integer_decode_f32);
2085
2086
    #[inline]
2087
    #[allow(deprecated)]
2088
    fn abs_sub(self, other: Self) -> Self {
2089
        libm::fdimf(self, other)
2090
    }
2091
2092
    forward! {
2093
        libm::floorf as floor(self) -> Self;
2094
        libm::ceilf as ceil(self) -> Self;
2095
        libm::roundf as round(self) -> Self;
2096
        libm::truncf as trunc(self) -> Self;
2097
        libm::fabsf as abs(self) -> Self;
2098
        libm::fmaf as mul_add(self, a: Self, b: Self) -> Self;
2099
        libm::powf as powf(self, n: Self) -> Self;
2100
        libm::sqrtf as sqrt(self) -> Self;
2101
        libm::expf as exp(self) -> Self;
2102
        libm::exp2f as exp2(self) -> Self;
2103
        libm::logf as ln(self) -> Self;
2104
        libm::log2f as log2(self) -> Self;
2105
        libm::log10f as log10(self) -> Self;
2106
        libm::cbrtf as cbrt(self) -> Self;
2107
        libm::hypotf as hypot(self, other: Self) -> Self;
2108
        libm::sinf as sin(self) -> Self;
2109
        libm::cosf as cos(self) -> Self;
2110
        libm::tanf as tan(self) -> Self;
2111
        libm::asinf as asin(self) -> Self;
2112
        libm::acosf as acos(self) -> Self;
2113
        libm::atanf as atan(self) -> Self;
2114
        libm::atan2f as atan2(self, other: Self) -> Self;
2115
        libm::sincosf as sin_cos(self) -> (Self, Self);
2116
        libm::expm1f as exp_m1(self) -> Self;
2117
        libm::log1pf as ln_1p(self) -> Self;
2118
        libm::sinhf as sinh(self) -> Self;
2119
        libm::coshf as cosh(self) -> Self;
2120
        libm::tanhf as tanh(self) -> Self;
2121
        libm::asinhf as asinh(self) -> Self;
2122
        libm::acoshf as acosh(self) -> Self;
2123
        libm::atanhf as atanh(self) -> Self;
2124
        libm::copysignf as copysign(self, other: Self) -> Self;
2125
    }
2126
}
2127
2128
#[cfg(all(not(feature = "std"), feature = "libm"))]
2129
impl Float for f64 {
2130
    float_impl_libm!(f64 integer_decode_f64);
2131
2132
    #[inline]
2133
    #[allow(deprecated)]
2134
    fn abs_sub(self, other: Self) -> Self {
2135
        libm::fdim(self, other)
2136
    }
2137
2138
    forward! {
2139
        libm::floor as floor(self) -> Self;
2140
        libm::ceil as ceil(self) -> Self;
2141
        libm::round as round(self) -> Self;
2142
        libm::trunc as trunc(self) -> Self;
2143
        libm::fabs as abs(self) -> Self;
2144
        libm::fma as mul_add(self, a: Self, b: Self) -> Self;
2145
        libm::pow as powf(self, n: Self) -> Self;
2146
        libm::sqrt as sqrt(self) -> Self;
2147
        libm::exp as exp(self) -> Self;
2148
        libm::exp2 as exp2(self) -> Self;
2149
        libm::log as ln(self) -> Self;
2150
        libm::log2 as log2(self) -> Self;
2151
        libm::log10 as log10(self) -> Self;
2152
        libm::cbrt as cbrt(self) -> Self;
2153
        libm::hypot as hypot(self, other: Self) -> Self;
2154
        libm::sin as sin(self) -> Self;
2155
        libm::cos as cos(self) -> Self;
2156
        libm::tan as tan(self) -> Self;
2157
        libm::asin as asin(self) -> Self;
2158
        libm::acos as acos(self) -> Self;
2159
        libm::atan as atan(self) -> Self;
2160
        libm::atan2 as atan2(self, other: Self) -> Self;
2161
        libm::sincos as sin_cos(self) -> (Self, Self);
2162
        libm::expm1 as exp_m1(self) -> Self;
2163
        libm::log1p as ln_1p(self) -> Self;
2164
        libm::sinh as sinh(self) -> Self;
2165
        libm::cosh as cosh(self) -> Self;
2166
        libm::tanh as tanh(self) -> Self;
2167
        libm::asinh as asinh(self) -> Self;
2168
        libm::acosh as acosh(self) -> Self;
2169
        libm::atanh as atanh(self) -> Self;
2170
        libm::copysign as copysign(self, sign: Self) -> Self;
2171
    }
2172
}
2173
2174
macro_rules! float_const_impl {
2175
    ($(#[$doc:meta] $constant:ident,)+) => (
2176
        #[allow(non_snake_case)]
2177
        pub trait FloatConst {
2178
            $(#[$doc] fn $constant() -> Self;)+
2179
            #[doc = "Return the full circle constant `τ`."]
2180
            #[inline]
2181
0
            fn TAU() -> Self where Self: Sized + Add<Self, Output = Self> {
2182
0
                Self::PI() + Self::PI()
2183
0
            }
2184
            #[doc = "Return `log10(2.0)`."]
2185
            #[inline]
2186
0
            fn LOG10_2() -> Self where Self: Sized + Div<Self, Output = Self> {
2187
0
                Self::LN_2() / Self::LN_10()
2188
0
            }
2189
            #[doc = "Return `log2(10.0)`."]
2190
            #[inline]
2191
0
            fn LOG2_10() -> Self where Self: Sized + Div<Self, Output = Self> {
2192
0
                Self::LN_10() / Self::LN_2()
2193
0
            }
2194
        }
2195
        float_const_impl! { @float f32, $($constant,)+ }
2196
        float_const_impl! { @float f64, $($constant,)+ }
2197
    );
2198
    (@float $T:ident, $($constant:ident,)+) => (
2199
        impl FloatConst for $T {
2200
            constant! {
2201
                $( $constant() -> $T::consts::$constant; )+
2202
                TAU() -> 6.28318530717958647692528676655900577;
2203
                LOG10_2() -> 0.301029995663981195213738894724493027;
2204
                LOG2_10() -> 3.32192809488736234787031942948939018;
2205
            }
2206
        }
2207
    );
2208
}
2209
2210
float_const_impl! {
2211
    #[doc = "Return Euler’s number."]
2212
    E,
2213
    #[doc = "Return `1.0 / π`."]
2214
    FRAC_1_PI,
2215
    #[doc = "Return `1.0 / sqrt(2.0)`."]
2216
    FRAC_1_SQRT_2,
2217
    #[doc = "Return `2.0 / π`."]
2218
    FRAC_2_PI,
2219
    #[doc = "Return `2.0 / sqrt(π)`."]
2220
    FRAC_2_SQRT_PI,
2221
    #[doc = "Return `π / 2.0`."]
2222
    FRAC_PI_2,
2223
    #[doc = "Return `π / 3.0`."]
2224
    FRAC_PI_3,
2225
    #[doc = "Return `π / 4.0`."]
2226
    FRAC_PI_4,
2227
    #[doc = "Return `π / 6.0`."]
2228
    FRAC_PI_6,
2229
    #[doc = "Return `π / 8.0`."]
2230
    FRAC_PI_8,
2231
    #[doc = "Return `ln(10.0)`."]
2232
    LN_10,
2233
    #[doc = "Return `ln(2.0)`."]
2234
    LN_2,
2235
    #[doc = "Return `log10(e)`."]
2236
    LOG10_E,
2237
    #[doc = "Return `log2(e)`."]
2238
    LOG2_E,
2239
    #[doc = "Return Archimedes’ constant `π`."]
2240
    PI,
2241
    #[doc = "Return `sqrt(2.0)`."]
2242
    SQRT_2,
2243
}
2244
2245
/// Trait for floating point numbers that provide an implementation
2246
/// of the `totalOrder` predicate as defined in the IEEE 754 (2008 revision)
2247
/// floating point standard.
2248
pub trait TotalOrder {
2249
    /// Return the ordering between `self` and `other`.
2250
    ///
2251
    /// Unlike the standard partial comparison between floating point numbers,
2252
    /// this comparison always produces an ordering in accordance to
2253
    /// the `totalOrder` predicate as defined in the IEEE 754 (2008 revision)
2254
    /// floating point standard. The values are ordered in the following sequence:
2255
    ///
2256
    /// - negative quiet NaN
2257
    /// - negative signaling NaN
2258
    /// - negative infinity
2259
    /// - negative numbers
2260
    /// - negative subnormal numbers
2261
    /// - negative zero
2262
    /// - positive zero
2263
    /// - positive subnormal numbers
2264
    /// - positive numbers
2265
    /// - positive infinity
2266
    /// - positive signaling NaN
2267
    /// - positive quiet NaN.
2268
    ///
2269
    /// The ordering established by this function does not always agree with the
2270
    /// [`PartialOrd`] and [`PartialEq`] implementations. For example,
2271
    /// they consider negative and positive zero equal, while `total_cmp`
2272
    /// doesn't.
2273
    ///
2274
    /// The interpretation of the signaling NaN bit follows the definition in
2275
    /// the IEEE 754 standard, which may not match the interpretation by some of
2276
    /// the older, non-conformant (e.g. MIPS) hardware implementations.
2277
    ///
2278
    /// # Examples
2279
    /// ```
2280
    /// use num_traits::float::TotalOrder;
2281
    /// use std::cmp::Ordering;
2282
    /// use std::{f32, f64};
2283
    ///
2284
    /// fn check_eq<T: TotalOrder>(x: T, y: T) {
2285
    ///     assert_eq!(x.total_cmp(&y), Ordering::Equal);
2286
    /// }
2287
    ///
2288
    /// check_eq(f64::NAN, f64::NAN);
2289
    /// check_eq(f32::NAN, f32::NAN);
2290
    ///
2291
    /// fn check_lt<T: TotalOrder>(x: T, y: T) {
2292
    ///     assert_eq!(x.total_cmp(&y), Ordering::Less);
2293
    /// }
2294
    ///
2295
    /// check_lt(-f64::NAN, f64::NAN);
2296
    /// check_lt(f64::INFINITY, f64::NAN);
2297
    /// check_lt(-0.0_f64, 0.0_f64);
2298
    /// ```
2299
    fn total_cmp(&self, other: &Self) -> Ordering;
2300
}
2301
macro_rules! totalorder_impl {
2302
    ($T:ident, $I:ident, $U:ident, $bits:expr) => {
2303
        impl TotalOrder for $T {
2304
            #[inline]
2305
            #[cfg(has_total_cmp)]
2306
0
            fn total_cmp(&self, other: &Self) -> Ordering {
2307
0
                // Forward to the core implementation
2308
0
                Self::total_cmp(&self, other)
2309
0
            }
Unexecuted instantiation: <f64 as num_traits::float::TotalOrder>::total_cmp
Unexecuted instantiation: <f32 as num_traits::float::TotalOrder>::total_cmp
2310
            #[inline]
2311
            #[cfg(not(has_total_cmp))]
2312
            fn total_cmp(&self, other: &Self) -> Ordering {
2313
                // Backport the core implementation (since 1.62)
2314
                let mut left = self.to_bits() as $I;
2315
                let mut right = other.to_bits() as $I;
2316
2317
                left ^= (((left >> ($bits - 1)) as $U) >> 1) as $I;
2318
                right ^= (((right >> ($bits - 1)) as $U) >> 1) as $I;
2319
2320
                left.cmp(&right)
2321
            }
2322
        }
2323
    };
2324
}
2325
totalorder_impl!(f64, i64, u64, 64);
2326
totalorder_impl!(f32, i32, u32, 32);
2327
2328
#[cfg(test)]
2329
mod tests {
2330
    use core::f64::consts;
2331
2332
    const DEG_RAD_PAIRS: [(f64, f64); 7] = [
2333
        (0.0, 0.),
2334
        (22.5, consts::FRAC_PI_8),
2335
        (30.0, consts::FRAC_PI_6),
2336
        (45.0, consts::FRAC_PI_4),
2337
        (60.0, consts::FRAC_PI_3),
2338
        (90.0, consts::FRAC_PI_2),
2339
        (180.0, consts::PI),
2340
    ];
2341
2342
    #[test]
2343
    fn convert_deg_rad() {
2344
        use crate::float::FloatCore;
2345
2346
        for &(deg, rad) in &DEG_RAD_PAIRS {
2347
            assert!((FloatCore::to_degrees(rad) - deg).abs() < 1e-6);
2348
            assert!((FloatCore::to_radians(deg) - rad).abs() < 1e-6);
2349
2350
            let (deg, rad) = (deg as f32, rad as f32);
2351
            assert!((FloatCore::to_degrees(rad) - deg).abs() < 1e-5);
2352
            assert!((FloatCore::to_radians(deg) - rad).abs() < 1e-5);
2353
        }
2354
    }
2355
2356
    #[cfg(any(feature = "std", feature = "libm"))]
2357
    #[test]
2358
    fn convert_deg_rad_std() {
2359
        for &(deg, rad) in &DEG_RAD_PAIRS {
2360
            use crate::Float;
2361
2362
            assert!((Float::to_degrees(rad) - deg).abs() < 1e-6);
2363
            assert!((Float::to_radians(deg) - rad).abs() < 1e-6);
2364
2365
            let (deg, rad) = (deg as f32, rad as f32);
2366
            assert!((Float::to_degrees(rad) - deg).abs() < 1e-5);
2367
            assert!((Float::to_radians(deg) - rad).abs() < 1e-5);
2368
        }
2369
    }
2370
2371
    #[test]
2372
    fn to_degrees_rounding() {
2373
        use crate::float::FloatCore;
2374
2375
        assert_eq!(
2376
            FloatCore::to_degrees(1_f32),
2377
            57.2957795130823208767981548141051703
2378
        );
2379
    }
2380
2381
    #[test]
2382
    #[cfg(any(feature = "std", feature = "libm"))]
2383
    fn extra_logs() {
2384
        use crate::float::{Float, FloatConst};
2385
2386
        fn check<F: Float + FloatConst>(diff: F) {
2387
            let _2 = F::from(2.0).unwrap();
2388
            assert!((F::LOG10_2() - F::log10(_2)).abs() < diff);
2389
            assert!((F::LOG10_2() - F::LN_2() / F::LN_10()).abs() < diff);
2390
2391
            let _10 = F::from(10.0).unwrap();
2392
            assert!((F::LOG2_10() - F::log2(_10)).abs() < diff);
2393
            assert!((F::LOG2_10() - F::LN_10() / F::LN_2()).abs() < diff);
2394
        }
2395
2396
        check::<f32>(1e-6);
2397
        check::<f64>(1e-12);
2398
    }
2399
2400
    #[test]
2401
    #[cfg(any(feature = "std", feature = "libm"))]
2402
    fn copysign() {
2403
        use crate::float::Float;
2404
        test_copysign_generic(2.0_f32, -2.0_f32, f32::nan());
2405
        test_copysign_generic(2.0_f64, -2.0_f64, f64::nan());
2406
        test_copysignf(2.0_f32, -2.0_f32, f32::nan());
2407
    }
2408
2409
    #[cfg(any(feature = "std", feature = "libm"))]
2410
    fn test_copysignf(p: f32, n: f32, nan: f32) {
2411
        use crate::float::Float;
2412
        use core::ops::Neg;
2413
2414
        assert!(p.is_sign_positive());
2415
        assert!(n.is_sign_negative());
2416
        assert!(nan.is_nan());
2417
2418
        assert_eq!(p, Float::copysign(p, p));
2419
        assert_eq!(p.neg(), Float::copysign(p, n));
2420
2421
        assert_eq!(n, Float::copysign(n, n));
2422
        assert_eq!(n.neg(), Float::copysign(n, p));
2423
2424
        assert!(Float::copysign(nan, p).is_sign_positive());
2425
        assert!(Float::copysign(nan, n).is_sign_negative());
2426
    }
2427
2428
    #[cfg(any(feature = "std", feature = "libm"))]
2429
    fn test_copysign_generic<F: crate::float::Float + ::core::fmt::Debug>(p: F, n: F, nan: F) {
2430
        assert!(p.is_sign_positive());
2431
        assert!(n.is_sign_negative());
2432
        assert!(nan.is_nan());
2433
        assert!(!nan.is_subnormal());
2434
2435
        assert_eq!(p, p.copysign(p));
2436
        assert_eq!(p.neg(), p.copysign(n));
2437
2438
        assert_eq!(n, n.copysign(n));
2439
        assert_eq!(n.neg(), n.copysign(p));
2440
2441
        assert!(nan.copysign(p).is_sign_positive());
2442
        assert!(nan.copysign(n).is_sign_negative());
2443
    }
2444
2445
    #[cfg(any(feature = "std", feature = "libm"))]
2446
    fn test_subnormal<F: crate::float::Float + ::core::fmt::Debug>() {
2447
        let min_positive = F::min_positive_value();
2448
        let lower_than_min = min_positive / F::from(2.0f32).unwrap();
2449
        assert!(!min_positive.is_subnormal());
2450
        assert!(lower_than_min.is_subnormal());
2451
    }
2452
2453
    #[test]
2454
    #[cfg(any(feature = "std", feature = "libm"))]
2455
    fn subnormal() {
2456
        test_subnormal::<f64>();
2457
        test_subnormal::<f32>();
2458
    }
2459
2460
    #[test]
2461
    fn total_cmp() {
2462
        use crate::float::TotalOrder;
2463
        use core::cmp::Ordering;
2464
        use core::{f32, f64};
2465
2466
        fn check_eq<T: TotalOrder>(x: T, y: T) {
2467
            assert_eq!(x.total_cmp(&y), Ordering::Equal);
2468
        }
2469
        fn check_lt<T: TotalOrder>(x: T, y: T) {
2470
            assert_eq!(x.total_cmp(&y), Ordering::Less);
2471
        }
2472
        fn check_gt<T: TotalOrder>(x: T, y: T) {
2473
            assert_eq!(x.total_cmp(&y), Ordering::Greater);
2474
        }
2475
2476
        check_eq(f64::NAN, f64::NAN);
2477
        check_eq(f32::NAN, f32::NAN);
2478
2479
        check_lt(-0.0_f64, 0.0_f64);
2480
        check_lt(-0.0_f32, 0.0_f32);
2481
2482
        // x87 registers don't preserve the exact value of signaling NaN:
2483
        // https://github.com/rust-lang/rust/issues/115567
2484
        #[cfg(not(target_arch = "x86"))]
2485
        {
2486
            let s_nan = f64::from_bits(0x7ff4000000000000);
2487
            let q_nan = f64::from_bits(0x7ff8000000000000);
2488
            check_lt(s_nan, q_nan);
2489
2490
            let neg_s_nan = f64::from_bits(0xfff4000000000000);
2491
            let neg_q_nan = f64::from_bits(0xfff8000000000000);
2492
            check_lt(neg_q_nan, neg_s_nan);
2493
2494
            let s_nan = f32::from_bits(0x7fa00000);
2495
            let q_nan = f32::from_bits(0x7fc00000);
2496
            check_lt(s_nan, q_nan);
2497
2498
            let neg_s_nan = f32::from_bits(0xffa00000);
2499
            let neg_q_nan = f32::from_bits(0xffc00000);
2500
            check_lt(neg_q_nan, neg_s_nan);
2501
        }
2502
2503
        check_lt(-f64::NAN, f64::NEG_INFINITY);
2504
        check_gt(1.0_f64, -f64::NAN);
2505
        check_lt(f64::INFINITY, f64::NAN);
2506
        check_gt(f64::NAN, 1.0_f64);
2507
2508
        check_lt(-f32::NAN, f32::NEG_INFINITY);
2509
        check_gt(1.0_f32, -f32::NAN);
2510
        check_lt(f32::INFINITY, f32::NAN);
2511
        check_gt(f32::NAN, 1.0_f32);
2512
    }
2513
}