Coverage Report

Created: 2025-07-23 06:18

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