f64.rs 23.3 KB
Newer Older
C
Clar Charr 已提交
1 2 3 4
//! This module provides constants which are specific to the implementation
//! of the `f64` floating point data type.
//!
//! *[See also the `f64` primitive type](../../std/primitive.f64.html).*
M
Michael Lamparski 已提交
5 6
//!
//! Mathematically significant numbers are provided in the `consts` sub-module.
7 8 9
//!
//! Although using these constants won’t cause compilation warnings,
//! new code should use the associated constants directly on the primitive type.
10

B
Brian Anderson 已提交
11
#![stable(feature = "rust1", since = "1.0.0")]
12

13
use crate::convert::FloatToInt;
14 15
#[cfg(not(test))]
use crate::intrinsics;
T
Taiki Endo 已提交
16 17
use crate::mem;
use crate::num::FpCategory;
A
Alex Crichton 已提交
18

O
Oliver Middleton 已提交
19
/// The radix or base of the internal representation of `f64`.
20
/// Use [`f64::RADIX`](../../std/primitive.f64.html#associatedconstant.RADIX) instead.
A
Aaron Turon 已提交
21
#[stable(feature = "rust1", since = "1.0.0")]
22
pub const RADIX: u32 = f64::RADIX;
23

O
Oliver Middleton 已提交
24
/// Number of significant digits in base 2.
25
/// Use [`f64::MANTISSA_DIGITS`](../../std/primitive.f64.html#associatedconstant.MANTISSA_DIGITS) instead.
A
Aaron Turon 已提交
26
#[stable(feature = "rust1", since = "1.0.0")]
27
pub const MANTISSA_DIGITS: u32 = f64::MANTISSA_DIGITS;
O
Oliver Middleton 已提交
28
/// Approximate number of significant digits in base 10.
29
/// Use [`f64::DIGITS`](../../std/primitive.f64.html#associatedconstant.DIGITS) instead.
A
Aaron Turon 已提交
30
#[stable(feature = "rust1", since = "1.0.0")]
31
pub const DIGITS: u32 = f64::DIGITS;
32

33
/// [Machine epsilon] value for `f64`.
34
/// Use [`f64::EPSILON`](../../std/primitive.f64.html#associatedconstant.EPSILON) instead.
35
///
O
Ohad Ravid 已提交
36
/// This is the difference between `1.0` and the next larger representable number.
37 38
///
/// [Machine epsilon]: https://en.wikipedia.org/wiki/Machine_epsilon
B
Brian Anderson 已提交
39
#[stable(feature = "rust1", since = "1.0.0")]
40
pub const EPSILON: f64 = f64::EPSILON;
41

O
Oliver Middleton 已提交
42
/// Smallest finite `f64` value.
43
/// Use [`f64::MIN`](../../std/primitive.f64.html#associatedconstant.MIN) instead.
44
#[stable(feature = "rust1", since = "1.0.0")]
45
pub const MIN: f64 = f64::MIN;
O
Oliver Middleton 已提交
46
/// Smallest positive normal `f64` value.
47
/// Use [`f64::MIN_POSITIVE`](../../std/primitive.f64.html#associatedconstant.MIN_POSITIVE) instead.
48
#[stable(feature = "rust1", since = "1.0.0")]
49
pub const MIN_POSITIVE: f64 = f64::MIN_POSITIVE;
O
Oliver Middleton 已提交
50
/// Largest finite `f64` value.
51
/// Use [`f64::MAX`](../../std/primitive.f64.html#associatedconstant.MAX) instead.
52
#[stable(feature = "rust1", since = "1.0.0")]
53
pub const MAX: f64 = f64::MAX;
54

55
/// One greater than the minimum possible normal power of 2 exponent.
56
/// Use [`f64::MIN_EXP`](../../std/primitive.f64.html#associatedconstant.MIN_EXP) instead.
A
Aaron Turon 已提交
57
#[stable(feature = "rust1", since = "1.0.0")]
58
pub const MIN_EXP: i32 = f64::MIN_EXP;
O
Oliver Middleton 已提交
59
/// Maximum possible power of 2 exponent.
60
/// Use [`f64::MAX_EXP`](../../std/primitive.f64.html#associatedconstant.MAX_EXP) instead.
A
Aaron Turon 已提交
61
#[stable(feature = "rust1", since = "1.0.0")]
62
pub const MAX_EXP: i32 = f64::MAX_EXP;
63

O
Oliver Middleton 已提交
64
/// Minimum possible normal power of 10 exponent.
65
/// Use [`f64::MIN_10_EXP`](../../std/primitive.f64.html#associatedconstant.MIN_10_EXP) instead.
A
Aaron Turon 已提交
66
#[stable(feature = "rust1", since = "1.0.0")]
67
pub const MIN_10_EXP: i32 = f64::MIN_10_EXP;
O
Oliver Middleton 已提交
68
/// Maximum possible power of 10 exponent.
69
/// Use [`f64::MAX_10_EXP`](../../std/primitive.f64.html#associatedconstant.MAX_10_EXP) instead.
A
Aaron Turon 已提交
70
#[stable(feature = "rust1", since = "1.0.0")]
71
pub const MAX_10_EXP: i32 = f64::MAX_10_EXP;
72

O
Oliver Middleton 已提交
73
/// Not a Number (NaN).
74
/// Use [`f64::NAN`](../../std/primitive.f64.html#associatedconstant.NAN) instead.
B
Brian Anderson 已提交
75
#[stable(feature = "rust1", since = "1.0.0")]
76
pub const NAN: f64 = f64::NAN;
O
Oliver Middleton 已提交
77
/// Infinity (∞).
78
/// Use [`f64::INFINITY`](../../std/primitive.f64.html#associatedconstant.INFINITY) instead.
B
Brian Anderson 已提交
79
#[stable(feature = "rust1", since = "1.0.0")]
80
pub const INFINITY: f64 = f64::INFINITY;
81
/// Negative infinity (−∞).
82
/// Use [`f64::NEG_INFINITY`](../../std/primitive.f64.html#associatedconstant.NEG_INFINITY) instead.
B
Brian Anderson 已提交
83
#[stable(feature = "rust1", since = "1.0.0")]
84
pub const NEG_INFINITY: f64 = f64::NEG_INFINITY;
85

J
Jed Davis 已提交
86
/// Basic mathematical constants.
A
Aaron Turon 已提交
87
#[stable(feature = "rust1", since = "1.0.0")]
88 89 90
pub mod consts {
    // FIXME: replace with mathematical constants from cmath.

O
Oliver Middleton 已提交
91
    /// Archimedes' constant (π)
A
Aaron Turon 已提交
92
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
93
    pub const PI: f64 = 3.14159265358979323846264338327950288_f64;
94

M
Mara Bos 已提交
95 96 97
    /// The full circle constant (τ)
    ///
    /// Equal to 2π.
M
Mara Bos 已提交
98
    #[unstable(feature = "tau_constant", issue = "66770")]
M
Mara Bos 已提交
99 100
    pub const TAU: f64 = 6.28318530717958647692528676655900577_f64;

O
Oliver Middleton 已提交
101
    /// π/2
A
Aaron Turon 已提交
102
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
103
    pub const FRAC_PI_2: f64 = 1.57079632679489661923132169163975144_f64;
104

O
Oliver Middleton 已提交
105
    /// π/3
A
Aaron Turon 已提交
106
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
107
    pub const FRAC_PI_3: f64 = 1.04719755119659774615421446109316763_f64;
108

O
Oliver Middleton 已提交
109
    /// π/4
A
Aaron Turon 已提交
110
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
111
    pub const FRAC_PI_4: f64 = 0.785398163397448309615660845819875721_f64;
112

O
Oliver Middleton 已提交
113
    /// π/6
A
Aaron Turon 已提交
114
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
115
    pub const FRAC_PI_6: f64 = 0.52359877559829887307710723054658381_f64;
116

O
Oliver Middleton 已提交
117
    /// π/8
A
Aaron Turon 已提交
118
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
119
    pub const FRAC_PI_8: f64 = 0.39269908169872415480783042290993786_f64;
120

O
Oliver Middleton 已提交
121
    /// 1/π
A
Aaron Turon 已提交
122
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
123
    pub const FRAC_1_PI: f64 = 0.318309886183790671537767526745028724_f64;
124

O
Oliver Middleton 已提交
125
    /// 2/π
A
Aaron Turon 已提交
126
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
127
    pub const FRAC_2_PI: f64 = 0.636619772367581343075535053490057448_f64;
128

O
Oliver Middleton 已提交
129
    /// 2/sqrt(π)
A
Aaron Turon 已提交
130 131 132
    #[stable(feature = "rust1", since = "1.0.0")]
    pub const FRAC_2_SQRT_PI: f64 = 1.12837916709551257389615890312154517_f64;

O
Oliver Middleton 已提交
133
    /// sqrt(2)
A
Aaron Turon 已提交
134 135 136
    #[stable(feature = "rust1", since = "1.0.0")]
    pub const SQRT_2: f64 = 1.41421356237309504880168872420969808_f64;

O
Oliver Middleton 已提交
137
    /// 1/sqrt(2)
A
Aaron Turon 已提交
138 139 140
    #[stable(feature = "rust1", since = "1.0.0")]
    pub const FRAC_1_SQRT_2: f64 = 0.707106781186547524400844362104849039_f64;

O
Oliver Middleton 已提交
141
    /// Euler's number (e)
A
Aaron Turon 已提交
142
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
143
    pub const E: f64 = 2.71828182845904523536028747135266250_f64;
144

C
Clar Charr 已提交
145
    /// log<sub>2</sub>(10)
146
    #[stable(feature = "extra_log_consts", since = "1.43.0")]
C
Clar Charr 已提交
147 148
    pub const LOG2_10: f64 = 3.32192809488736234787031942948939018_f64;

O
Oliver Middleton 已提交
149
    /// log<sub>2</sub>(e)
A
Aaron Turon 已提交
150
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
151
    pub const LOG2_E: f64 = 1.44269504088896340735992468100189214_f64;
152

C
Clar Charr 已提交
153
    /// log<sub>10</sub>(2)
154
    #[stable(feature = "extra_log_consts", since = "1.43.0")]
C
Clar Charr 已提交
155 156
    pub const LOG10_2: f64 = 0.301029995663981195213738894724493027_f64;

O
Oliver Middleton 已提交
157
    /// log<sub>10</sub>(e)
A
Aaron Turon 已提交
158
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
159
    pub const LOG10_E: f64 = 0.434294481903251827651128918916605082_f64;
160

O
Oliver Middleton 已提交
161
    /// ln(2)
A
Aaron Turon 已提交
162
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
163
    pub const LN_2: f64 = 0.693147180559945309417232121458176568_f64;
164

O
Oliver Middleton 已提交
165
    /// ln(10)
A
Aaron Turon 已提交
166
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
167
    pub const LN_10: f64 = 2.30258509299404568401799145468436421_f64;
168 169
}

S
Simon Sapin 已提交
170 171 172
#[lang = "f64"]
#[cfg(not(test))]
impl f64 {
173
    /// The radix or base of the internal representation of `f64`.
L
Linus Färnstrand 已提交
174
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
175 176 177
    pub const RADIX: u32 = 2;

    /// Number of significant digits in base 2.
L
Linus Färnstrand 已提交
178
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
179 180
    pub const MANTISSA_DIGITS: u32 = 53;
    /// Approximate number of significant digits in base 10.
L
Linus Färnstrand 已提交
181
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
182 183 184 185 186 187 188
    pub const DIGITS: u32 = 15;

    /// [Machine epsilon] value for `f64`.
    ///
    /// This is the difference between `1.0` and the next larger representable number.
    ///
    /// [Machine epsilon]: https://en.wikipedia.org/wiki/Machine_epsilon
L
Linus Färnstrand 已提交
189
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
190 191 192
    pub const EPSILON: f64 = 2.2204460492503131e-16_f64;

    /// Smallest finite `f64` value.
L
Linus Färnstrand 已提交
193
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
194 195
    pub const MIN: f64 = -1.7976931348623157e+308_f64;
    /// Smallest positive normal `f64` value.
L
Linus Färnstrand 已提交
196
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
197 198
    pub const MIN_POSITIVE: f64 = 2.2250738585072014e-308_f64;
    /// Largest finite `f64` value.
L
Linus Färnstrand 已提交
199
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
200 201 202
    pub const MAX: f64 = 1.7976931348623157e+308_f64;

    /// One greater than the minimum possible normal power of 2 exponent.
L
Linus Färnstrand 已提交
203
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
204 205
    pub const MIN_EXP: i32 = -1021;
    /// Maximum possible power of 2 exponent.
L
Linus Färnstrand 已提交
206
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
207 208 209
    pub const MAX_EXP: i32 = 1024;

    /// Minimum possible normal power of 10 exponent.
L
Linus Färnstrand 已提交
210
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
211 212
    pub const MIN_10_EXP: i32 = -307;
    /// Maximum possible power of 10 exponent.
L
Linus Färnstrand 已提交
213
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
214 215 216
    pub const MAX_10_EXP: i32 = 308;

    /// Not a Number (NaN).
L
Linus Färnstrand 已提交
217
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
218 219
    pub const NAN: f64 = 0.0_f64 / 0.0_f64;
    /// Infinity (∞).
L
Linus Färnstrand 已提交
220
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
221 222
    pub const INFINITY: f64 = 1.0_f64 / 0.0_f64;
    /// Negative infinity (-∞).
L
Linus Färnstrand 已提交
223
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
224 225
    pub const NEG_INFINITY: f64 = -1.0_f64 / 0.0_f64;

A
Alexander Regueiro 已提交
226
    /// Returns `true` if this value is `NaN`.
227 228 229 230 231 232 233 234 235 236
    ///
    /// ```
    /// let nan = f64::NAN;
    /// let f = 7.0_f64;
    ///
    /// assert!(nan.is_nan());
    /// assert!(!f.is_nan());
    /// ```
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
S
Simon Sapin 已提交
237 238 239
    pub fn is_nan(self) -> bool {
        self != self
    }
240

241 242 243 244 245 246 247 248
    // FIXME(#50145): `abs` is publicly unavailable in libcore due to
    // concerns about portability, so this implementation is for
    // private use internally.
    #[inline]
    fn abs_private(self) -> f64 {
        f64::from_bits(self.to_bits() & 0x7fff_ffff_ffff_ffff)
    }

A
Alexander Regueiro 已提交
249 250
    /// Returns `true` if this value is positive infinity or negative infinity, and
    /// `false` otherwise.
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
    ///
    /// ```
    /// let f = 7.0f64;
    /// let inf = f64::INFINITY;
    /// let neg_inf = f64::NEG_INFINITY;
    /// let nan = f64::NAN;
    ///
    /// assert!(!f.is_infinite());
    /// assert!(!nan.is_infinite());
    ///
    /// assert!(inf.is_infinite());
    /// assert!(neg_inf.is_infinite());
    /// ```
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
S
Simon Sapin 已提交
266
    pub fn is_infinite(self) -> bool {
267
        self.abs_private() == INFINITY
S
Simon Sapin 已提交
268
    }
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285

    /// Returns `true` if this number is neither infinite nor `NaN`.
    ///
    /// ```
    /// let f = 7.0f64;
    /// let inf: f64 = f64::INFINITY;
    /// let neg_inf: f64 = f64::NEG_INFINITY;
    /// let nan: f64 = f64::NAN;
    ///
    /// assert!(f.is_finite());
    ///
    /// assert!(!nan.is_finite());
    /// assert!(!inf.is_finite());
    /// assert!(!neg_inf.is_finite());
    /// ```
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
S
Simon Sapin 已提交
286
    pub fn is_finite(self) -> bool {
287 288 289
        // There's no need to handle NaN separately: if self is NaN,
        // the comparison is not true, exactly as desired.
        self.abs_private() < INFINITY
S
Simon Sapin 已提交
290
    }
291 292

    /// Returns `true` if the number is neither zero, infinite,
M
Matthew Kraai 已提交
293
    /// [subnormal], or `NaN`.
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
    ///
    /// ```
    /// let min = f64::MIN_POSITIVE; // 2.2250738585072014e-308f64
    /// let max = f64::MAX;
    /// let lower_than_min = 1.0e-308_f64;
    /// let zero = 0.0f64;
    ///
    /// assert!(min.is_normal());
    /// assert!(max.is_normal());
    ///
    /// assert!(!zero.is_normal());
    /// assert!(!f64::NAN.is_normal());
    /// assert!(!f64::INFINITY.is_normal());
    /// // Values between `0` and `min` are Subnormal.
    /// assert!(!lower_than_min.is_normal());
    /// ```
    /// [subnormal]: https://en.wikipedia.org/wiki/Denormal_number
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
S
Simon Sapin 已提交
313 314 315
    pub fn is_normal(self) -> bool {
        self.classify() == FpCategory::Normal
    }
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330

    /// Returns the floating point category of the number. If only one property
    /// is going to be tested, it is generally faster to use the specific
    /// predicate instead.
    ///
    /// ```
    /// use std::num::FpCategory;
    ///
    /// let num = 12.4_f64;
    /// let inf = f64::INFINITY;
    ///
    /// assert_eq!(num.classify(), FpCategory::Normal);
    /// assert_eq!(inf.classify(), FpCategory::Infinite);
    /// ```
    #[stable(feature = "rust1", since = "1.0.0")]
S
Simon Sapin 已提交
331 332 333 334 335 336 337 338 339 340 341 342 343
    pub fn classify(self) -> FpCategory {
        const EXP_MASK: u64 = 0x7ff0000000000000;
        const MAN_MASK: u64 = 0x000fffffffffffff;

        let bits = self.to_bits();
        match (bits & MAN_MASK, bits & EXP_MASK) {
            (0, 0) => FpCategory::Zero,
            (_, 0) => FpCategory::Subnormal,
            (0, EXP_MASK) => FpCategory::Infinite,
            (_, EXP_MASK) => FpCategory::Nan,
            _ => FpCategory::Normal,
        }
    }
344

A
Alexander Regueiro 已提交
345
    /// Returns `true` if `self` has a positive sign, including `+0.0`, `NaN`s with
346 347 348 349 350 351 352 353 354 355 356
    /// positive sign bit and positive infinity.
    ///
    /// ```
    /// let f = 7.0_f64;
    /// let g = -7.0_f64;
    ///
    /// assert!(f.is_sign_positive());
    /// assert!(!g.is_sign_positive());
    /// ```
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
S
Simon Sapin 已提交
357 358 359
    pub fn is_sign_positive(self) -> bool {
        !self.is_sign_negative()
    }
360 361 362 363 364

    #[stable(feature = "rust1", since = "1.0.0")]
    #[rustc_deprecated(since = "1.0.0", reason = "renamed to is_sign_positive")]
    #[inline]
    #[doc(hidden)]
S
Simon Sapin 已提交
365 366 367
    pub fn is_positive(self) -> bool {
        self.is_sign_positive()
    }
368

A
Alexander Regueiro 已提交
369
    /// Returns `true` if `self` has a negative sign, including `-0.0`, `NaN`s with
370 371 372 373 374 375 376 377 378 379 380
    /// negative sign bit and negative infinity.
    ///
    /// ```
    /// let f = 7.0_f64;
    /// let g = -7.0_f64;
    ///
    /// assert!(!f.is_sign_negative());
    /// assert!(g.is_sign_negative());
    /// ```
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
S
Simon Sapin 已提交
381 382 383
    pub fn is_sign_negative(self) -> bool {
        self.to_bits() & 0x8000_0000_0000_0000 != 0
    }
384 385 386 387 388

    #[stable(feature = "rust1", since = "1.0.0")]
    #[rustc_deprecated(since = "1.0.0", reason = "renamed to is_sign_negative")]
    #[inline]
    #[doc(hidden)]
S
Simon Sapin 已提交
389 390 391
    pub fn is_negative(self) -> bool {
        self.is_sign_negative()
    }
392 393 394 395 396

    /// Takes the reciprocal (inverse) of a number, `1/x`.
    ///
    /// ```
    /// let x = 2.0_f64;
397
    /// let abs_difference = (x.recip() - (1.0 / x)).abs();
398 399 400 401 402
    ///
    /// assert!(abs_difference < 1e-10);
    /// ```
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
S
Simon Sapin 已提交
403 404 405
    pub fn recip(self) -> f64 {
        1.0 / self
    }
406 407 408 409

    /// Converts radians to degrees.
    ///
    /// ```
410
    /// let angle = std::f64::consts::PI;
411 412 413 414 415 416 417
    ///
    /// let abs_difference = (angle.to_degrees() - 180.0).abs();
    ///
    /// assert!(abs_difference < 1e-10);
    /// ```
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
S
Simon Sapin 已提交
418 419 420 421 422 423
    pub fn to_degrees(self) -> f64 {
        // The division here is correctly rounded with respect to the true
        // value of 180/π. (This differs from f32, where a constant must be
        // used to ensure a correctly rounded result.)
        self * (180.0f64 / consts::PI)
    }
424 425 426 427 428 429

    /// Converts degrees to radians.
    ///
    /// ```
    /// let angle = 180.0_f64;
    ///
430
    /// let abs_difference = (angle.to_radians() - std::f64::consts::PI).abs();
431 432 433 434 435
    ///
    /// assert!(abs_difference < 1e-10);
    /// ```
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
S
Simon Sapin 已提交
436 437 438 439
    pub fn to_radians(self) -> f64 {
        let value: f64 = consts::PI;
        self * (value / 180.0)
    }
440 441 442 443 444 445 446 447 448 449 450 451 452 453

    /// Returns the maximum of the two numbers.
    ///
    /// ```
    /// let x = 1.0_f64;
    /// let y = 2.0_f64;
    ///
    /// assert_eq!(x.max(y), y);
    /// ```
    ///
    /// If one of the arguments is NaN, then the other argument is returned.
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
    pub fn max(self, other: f64) -> f64 {
454
        intrinsics::maxnumf64(self, other)
455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
    }

    /// Returns the minimum of the two numbers.
    ///
    /// ```
    /// let x = 1.0_f64;
    /// let y = 2.0_f64;
    ///
    /// assert_eq!(x.min(y), x);
    /// ```
    ///
    /// If one of the arguments is NaN, then the other argument is returned.
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
    pub fn min(self, other: f64) -> f64 {
470
        intrinsics::minnumf64(self, other)
471 472
    }

473 474 475 476 477
    /// Rounds toward zero and converts to any primitive integer type,
    /// assuming that the value is finite and fits in that type.
    ///
    /// ```
    /// let value = 4.6_f32;
478
    /// let rounded = unsafe { value.to_int_unchecked::<u16>() };
479 480 481
    /// assert_eq!(rounded, 4);
    ///
    /// let value = -128.9_f32;
482
    /// let rounded = unsafe { value.to_int_unchecked::<i8>() };
483
    /// assert_eq!(rounded, i8::MIN);
484 485 486 487 488 489 490 491 492
    /// ```
    ///
    /// # Safety
    ///
    /// The value must:
    ///
    /// * Not be `NaN`
    /// * Not be infinite
    /// * Be representable in the return type `Int`, after truncating off its fractional part
493
    #[stable(feature = "float_approx_unchecked_to", since = "1.44.0")]
494
    #[inline]
495
    pub unsafe fn to_int_unchecked<Int>(self) -> Int
496 497 498
    where
        Self: FloatToInt<Int>,
    {
499
        FloatToInt::<Int>::to_int_unchecked(self)
500 501
    }

502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521
    /// Raw transmutation to `u64`.
    ///
    /// This is currently identical to `transmute::<f64, u64>(self)` on all platforms.
    ///
    /// See `from_bits` for some discussion of the portability of this operation
    /// (there are almost no issues).
    ///
    /// Note that this function is distinct from `as` casting, which attempts to
    /// preserve the *numeric* value, and not the bitwise value.
    ///
    /// # Examples
    ///
    /// ```
    /// assert!((1f64).to_bits() != 1f64 as u64); // to_bits() is not casting!
    /// assert_eq!((12.5f64).to_bits(), 0x4029000000000000);
    ///
    /// ```
    #[stable(feature = "float_bits_conv", since = "1.20.0")]
    #[inline]
    pub fn to_bits(self) -> u64 {
522
        // SAFETY: `u64` is a plain old datatype so we can always transmute to it
S
Simon Sapin 已提交
523
        unsafe { mem::transmute(self) }
524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
    }

    /// Raw transmutation from `u64`.
    ///
    /// This is currently identical to `transmute::<u64, f64>(v)` on all platforms.
    /// It turns out this is incredibly portable, for two reasons:
    ///
    /// * Floats and Ints have the same endianness on all supported platforms.
    /// * IEEE-754 very precisely specifies the bit layout of floats.
    ///
    /// However there is one caveat: prior to the 2008 version of IEEE-754, how
    /// to interpret the NaN signaling bit wasn't actually specified. Most platforms
    /// (notably x86 and ARM) picked the interpretation that was ultimately
    /// standardized in 2008, but some didn't (notably MIPS). As a result, all
    /// signaling NaNs on MIPS are quiet NaNs on x86, and vice-versa.
    ///
    /// Rather than trying to preserve signaling-ness cross-platform, this
    /// implementation favours preserving the exact bits. This means that
    /// any payloads encoded in NaNs will be preserved even if the result of
    /// this method is sent over the network from an x86 machine to a MIPS one.
    ///
    /// If the results of this method are only manipulated by the same
    /// architecture that produced them, then there is no portability concern.
    ///
    /// If the input isn't NaN, then there is no portability concern.
    ///
    /// If you don't care about signalingness (very likely), then there is no
    /// portability concern.
    ///
    /// Note that this function is distinct from `as` casting, which attempts to
    /// preserve the *numeric* value, and not the bitwise value.
    ///
    /// # Examples
    ///
    /// ```
    /// let v = f64::from_bits(0x4029000000000000);
560
    /// assert_eq!(v, 12.5);
561 562 563 564
    /// ```
    #[stable(feature = "float_bits_conv", since = "1.20.0")]
    #[inline]
    pub fn from_bits(v: u64) -> Self {
565
        // SAFETY: `u64` is a plain old datatype so we can always transmute from it
S
Simon Sapin 已提交
566 567
        // It turns out the safety issues with sNaN were overblown! Hooray!
        unsafe { mem::transmute(v) }
568
    }
569

570 571 572 573 574 575 576 577 578
    /// Return the memory representation of this floating point number as a byte array in
    /// big-endian (network) byte order.
    ///
    /// # Examples
    ///
    /// ```
    /// let bytes = 12.5f64.to_be_bytes();
    /// assert_eq!(bytes, [0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
    /// ```
L
Lzu Tao 已提交
579
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
580 581 582 583 584
    #[inline]
    pub fn to_be_bytes(self) -> [u8; 8] {
        self.to_bits().to_be_bytes()
    }

585 586 587 588 589 590 591 592 593
    /// Return the memory representation of this floating point number as a byte array in
    /// little-endian byte order.
    ///
    /// # Examples
    ///
    /// ```
    /// let bytes = 12.5f64.to_le_bytes();
    /// assert_eq!(bytes, [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40]);
    /// ```
L
Lzu Tao 已提交
594
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
595 596 597 598 599
    #[inline]
    pub fn to_le_bytes(self) -> [u8; 8] {
        self.to_bits().to_le_bytes()
    }

600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621
    /// Return the memory representation of this floating point number as a byte array in
    /// native byte order.
    ///
    /// As the target platform's native endianness is used, portable code
    /// should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate, instead.
    ///
    /// [`to_be_bytes`]: #method.to_be_bytes
    /// [`to_le_bytes`]: #method.to_le_bytes
    ///
    /// # Examples
    ///
    /// ```
    /// let bytes = 12.5f64.to_ne_bytes();
    /// assert_eq!(
    ///     bytes,
    ///     if cfg!(target_endian = "big") {
    ///         [0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
    ///     } else {
    ///         [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40]
    ///     }
    /// );
    /// ```
L
Lzu Tao 已提交
622
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
623 624 625 626 627
    #[inline]
    pub fn to_ne_bytes(self) -> [u8; 8] {
        self.to_bits().to_ne_bytes()
    }

628 629 630 631 632 633 634 635
    /// Create a floating point value from its representation as a byte array in big endian.
    ///
    /// # Examples
    ///
    /// ```
    /// let value = f64::from_be_bytes([0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
    /// assert_eq!(value, 12.5);
    /// ```
L
Lzu Tao 已提交
636
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
637 638 639 640 641
    #[inline]
    pub fn from_be_bytes(bytes: [u8; 8]) -> Self {
        Self::from_bits(u64::from_be_bytes(bytes))
    }

642
    /// Create a floating point value from its representation as a byte array in little endian.
643 644 645 646 647 648 649
    ///
    /// # Examples
    ///
    /// ```
    /// let value = f64::from_le_bytes([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40]);
    /// assert_eq!(value, 12.5);
    /// ```
L
Lzu Tao 已提交
650
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
651 652 653 654 655
    #[inline]
    pub fn from_le_bytes(bytes: [u8; 8]) -> Self {
        Self::from_bits(u64::from_le_bytes(bytes))
    }

656
    /// Create a floating point value from its representation as a byte array in native endian.
657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674
    ///
    /// As the target platform's native endianness is used, portable code
    /// likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as
    /// appropriate instead.
    ///
    /// [`from_be_bytes`]: #method.from_be_bytes
    /// [`from_le_bytes`]: #method.from_le_bytes
    ///
    /// # Examples
    ///
    /// ```
    /// let value = f64::from_ne_bytes(if cfg!(target_endian = "big") {
    ///     [0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
    /// } else {
    ///     [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40]
    /// });
    /// assert_eq!(value, 12.5);
    /// ```
L
Lzu Tao 已提交
675
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
676 677 678 679
    #[inline]
    pub fn from_ne_bytes(bytes: [u8; 8]) -> Self {
        Self::from_bits(u64::from_ne_bytes(bytes))
    }
680
}