f64.rs 25.4 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.
S
Steve Klabnik 已提交
21 22 23 24 25 26 27 28 29 30
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let r = std::f64::RADIX;
///
/// // intended way
/// let r = f64::RADIX;
/// ```
A
Aaron Turon 已提交
31
#[stable(feature = "rust1", since = "1.0.0")]
32
pub const RADIX: u32 = f64::RADIX;
33

O
Oliver Middleton 已提交
34
/// Number of significant digits in base 2.
35
/// Use [`f64::MANTISSA_DIGITS`](../../std/primitive.f64.html#associatedconstant.MANTISSA_DIGITS) instead.
S
Steve Klabnik 已提交
36 37 38 39 40 41 42 43 44 45
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let d = std::f64::MANTISSA_DIGITS;
///
/// // intended way
/// let d = f64::MANTISSA_DIGITS;
/// ```
A
Aaron Turon 已提交
46
#[stable(feature = "rust1", since = "1.0.0")]
47
pub const MANTISSA_DIGITS: u32 = f64::MANTISSA_DIGITS;
S
Steve Klabnik 已提交
48

O
Oliver Middleton 已提交
49
/// Approximate number of significant digits in base 10.
50
/// Use [`f64::DIGITS`](../../std/primitive.f64.html#associatedconstant.DIGITS) instead.
S
Steve Klabnik 已提交
51 52 53 54 55 56 57 58 59 60
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let d = std::f64::DIGITS;
///
/// // intended way
/// let d = f64::DIGITS;
/// ```
A
Aaron Turon 已提交
61
#[stable(feature = "rust1", since = "1.0.0")]
62
pub const DIGITS: u32 = f64::DIGITS;
63

64
/// [Machine epsilon] value for `f64`.
65
/// Use [`f64::EPSILON`](../../std/primitive.f64.html#associatedconstant.EPSILON) instead.
66
///
O
Ohad Ravid 已提交
67
/// This is the difference between `1.0` and the next larger representable number.
68 69
///
/// [Machine epsilon]: https://en.wikipedia.org/wiki/Machine_epsilon
S
Steve Klabnik 已提交
70 71 72 73 74 75 76 77 78 79
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let e = std::f64::EPSILON;
///
/// // intended way
/// let e = f64::EPSILON;
/// ```
B
Brian Anderson 已提交
80
#[stable(feature = "rust1", since = "1.0.0")]
81
pub const EPSILON: f64 = f64::EPSILON;
82

O
Oliver Middleton 已提交
83
/// Smallest finite `f64` value.
84
/// Use [`f64::MIN`](../../std/primitive.f64.html#associatedconstant.MIN) instead.
S
Steve Klabnik 已提交
85 86 87 88 89 90 91 92 93 94
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let min = std::f64::MIN;
///
/// // intended way
/// let min = f64::MIN;
/// ```
95
#[stable(feature = "rust1", since = "1.0.0")]
96
pub const MIN: f64 = f64::MIN;
S
Steve Klabnik 已提交
97

O
Oliver Middleton 已提交
98
/// Smallest positive normal `f64` value.
99
/// Use [`f64::MIN_POSITIVE`](../../std/primitive.f64.html#associatedconstant.MIN_POSITIVE) instead.
S
Steve Klabnik 已提交
100 101 102 103 104 105 106 107 108 109
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let min = std::f64::MIN_POSITIVE;
///
/// // intended way
/// let min = f64::MIN_POSITIVE;
/// ```
110
#[stable(feature = "rust1", since = "1.0.0")]
111
pub const MIN_POSITIVE: f64 = f64::MIN_POSITIVE;
S
Steve Klabnik 已提交
112

O
Oliver Middleton 已提交
113
/// Largest finite `f64` value.
114
/// Use [`f64::MAX`](../../std/primitive.f64.html#associatedconstant.MAX) instead.
S
Steve Klabnik 已提交
115 116 117 118 119 120 121 122 123 124
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let max = std::f64::MAX;
///
/// // intended way
/// let max = f64::MAX;
/// ```
125
#[stable(feature = "rust1", since = "1.0.0")]
126
pub const MAX: f64 = f64::MAX;
127

128
/// One greater than the minimum possible normal power of 2 exponent.
129
/// Use [`f64::MIN_EXP`](../../std/primitive.f64.html#associatedconstant.MIN_EXP) instead.
S
Steve Klabnik 已提交
130 131 132 133 134 135 136 137 138 139
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let min = std::f64::MIN_EXP;
///
/// // intended way
/// let min = f64::MIN_EXP;
/// ```
A
Aaron Turon 已提交
140
#[stable(feature = "rust1", since = "1.0.0")]
141
pub const MIN_EXP: i32 = f64::MIN_EXP;
S
Steve Klabnik 已提交
142

O
Oliver Middleton 已提交
143
/// Maximum possible power of 2 exponent.
144
/// Use [`f64::MAX_EXP`](../../std/primitive.f64.html#associatedconstant.MAX_EXP) instead.
S
Steve Klabnik 已提交
145 146 147 148 149 150 151 152 153 154
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let max = std::f64::MAX_EXP;
///
/// // intended way
/// let max = f64::MAX_EXP;
/// ```
A
Aaron Turon 已提交
155
#[stable(feature = "rust1", since = "1.0.0")]
156
pub const MAX_EXP: i32 = f64::MAX_EXP;
157

O
Oliver Middleton 已提交
158
/// Minimum possible normal power of 10 exponent.
159
/// Use [`f64::MIN_10_EXP`](../../std/primitive.f64.html#associatedconstant.MIN_10_EXP) instead.
S
Steve Klabnik 已提交
160 161 162 163 164 165 166 167 168 169
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let min = std::f64::MIN_10_EXP;
///
/// // intended way
/// let min = f64::MIN_10_EXP;
/// ```
A
Aaron Turon 已提交
170
#[stable(feature = "rust1", since = "1.0.0")]
171
pub const MIN_10_EXP: i32 = f64::MIN_10_EXP;
S
Steve Klabnik 已提交
172

O
Oliver Middleton 已提交
173
/// Maximum possible power of 10 exponent.
174
/// Use [`f64::MAX_10_EXP`](../../std/primitive.f64.html#associatedconstant.MAX_10_EXP) instead.
S
Steve Klabnik 已提交
175 176 177 178 179 180 181 182 183 184
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let max = std::f64::MAX_10_EXP;
///
/// // intended way
/// let max = f64::MAX_10_EXP;
/// ```
A
Aaron Turon 已提交
185
#[stable(feature = "rust1", since = "1.0.0")]
186
pub const MAX_10_EXP: i32 = f64::MAX_10_EXP;
187

O
Oliver Middleton 已提交
188
/// Not a Number (NaN).
189
/// Use [`f64::NAN`](../../std/primitive.f64.html#associatedconstant.NAN) instead.
S
Steve Klabnik 已提交
190 191 192 193 194 195 196 197 198 199
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let nan = std::f64::NAN;
///
/// // intended way
/// let nan = f64::NAN;
/// ```
B
Brian Anderson 已提交
200
#[stable(feature = "rust1", since = "1.0.0")]
201
pub const NAN: f64 = f64::NAN;
S
Steve Klabnik 已提交
202

O
Oliver Middleton 已提交
203
/// Infinity (∞).
204
/// Use [`f64::INFINITY`](../../std/primitive.f64.html#associatedconstant.INFINITY) instead.
S
Steve Klabnik 已提交
205 206 207 208 209 210 211 212 213 214
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let inf = std::f64::INFINITY;
///
/// // intended way
/// let inf = f64::INFINITY;
/// ```
B
Brian Anderson 已提交
215
#[stable(feature = "rust1", since = "1.0.0")]
216
pub const INFINITY: f64 = f64::INFINITY;
S
Steve Klabnik 已提交
217

218
/// Negative infinity (−∞).
219
/// Use [`f64::NEG_INFINITY`](../../std/primitive.f64.html#associatedconstant.NEG_INFINITY) instead.
S
Steve Klabnik 已提交
220 221 222 223 224 225 226 227 228 229
///
/// # Examples
///
/// ```rust
/// // deprecated way
/// let ninf = std::f64::NEG_INFINITY;
///
/// // intended way
/// let ninf = f64::NEG_INFINITY;
/// ```
B
Brian Anderson 已提交
230
#[stable(feature = "rust1", since = "1.0.0")]
231
pub const NEG_INFINITY: f64 = f64::NEG_INFINITY;
232

J
Jed Davis 已提交
233
/// Basic mathematical constants.
A
Aaron Turon 已提交
234
#[stable(feature = "rust1", since = "1.0.0")]
235 236 237
pub mod consts {
    // FIXME: replace with mathematical constants from cmath.

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

M
Mara Bos 已提交
242 243 244
    /// The full circle constant (τ)
    ///
    /// Equal to 2π.
M
Mara Bos 已提交
245
    #[unstable(feature = "tau_constant", issue = "66770")]
M
Mara Bos 已提交
246 247
    pub const TAU: f64 = 6.28318530717958647692528676655900577_f64;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

O
Oliver Middleton 已提交
312
    /// ln(10)
A
Aaron Turon 已提交
313
    #[stable(feature = "rust1", since = "1.0.0")]
A
Alex Crichton 已提交
314
    pub const LN_10: f64 = 2.30258509299404568401799145468436421_f64;
315 316
}

S
Simon Sapin 已提交
317 318 319
#[lang = "f64"]
#[cfg(not(test))]
impl f64 {
320
    /// The radix or base of the internal representation of `f64`.
L
Linus Färnstrand 已提交
321
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
322 323 324
    pub const RADIX: u32 = 2;

    /// Number of significant digits in base 2.
L
Linus Färnstrand 已提交
325
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
326 327
    pub const MANTISSA_DIGITS: u32 = 53;
    /// Approximate number of significant digits in base 10.
L
Linus Färnstrand 已提交
328
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
329 330 331 332 333 334 335
    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 已提交
336
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
337 338 339
    pub const EPSILON: f64 = 2.2204460492503131e-16_f64;

    /// Smallest finite `f64` value.
L
Linus Färnstrand 已提交
340
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
341 342
    pub const MIN: f64 = -1.7976931348623157e+308_f64;
    /// Smallest positive normal `f64` value.
L
Linus Färnstrand 已提交
343
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
344 345
    pub const MIN_POSITIVE: f64 = 2.2250738585072014e-308_f64;
    /// Largest finite `f64` value.
L
Linus Färnstrand 已提交
346
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
347 348 349
    pub const MAX: f64 = 1.7976931348623157e+308_f64;

    /// One greater than the minimum possible normal power of 2 exponent.
L
Linus Färnstrand 已提交
350
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
351 352
    pub const MIN_EXP: i32 = -1021;
    /// Maximum possible power of 2 exponent.
L
Linus Färnstrand 已提交
353
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
354 355 356
    pub const MAX_EXP: i32 = 1024;

    /// Minimum possible normal power of 10 exponent.
L
Linus Färnstrand 已提交
357
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
358 359
    pub const MIN_10_EXP: i32 = -307;
    /// Maximum possible power of 10 exponent.
L
Linus Färnstrand 已提交
360
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
361 362 363
    pub const MAX_10_EXP: i32 = 308;

    /// Not a Number (NaN).
L
Linus Färnstrand 已提交
364
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
365 366
    pub const NAN: f64 = 0.0_f64 / 0.0_f64;
    /// Infinity (∞).
L
Linus Färnstrand 已提交
367
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
368 369
    pub const INFINITY: f64 = 1.0_f64 / 0.0_f64;
    /// Negative infinity (-∞).
L
Linus Färnstrand 已提交
370
    #[stable(feature = "assoc_int_consts", since = "1.43.0")]
371 372
    pub const NEG_INFINITY: f64 = -1.0_f64 / 0.0_f64;

A
Alexander Regueiro 已提交
373
    /// Returns `true` if this value is `NaN`.
374 375 376 377 378 379 380 381 382 383
    ///
    /// ```
    /// 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 已提交
384 385 386
    pub fn is_nan(self) -> bool {
        self != self
    }
387

388 389 390 391 392 393 394 395
    // 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 已提交
396 397
    /// Returns `true` if this value is positive infinity or negative infinity, and
    /// `false` otherwise.
398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
    ///
    /// ```
    /// 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 已提交
413
    pub fn is_infinite(self) -> bool {
414
        self.abs_private() == Self::INFINITY
S
Simon Sapin 已提交
415
    }
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432

    /// 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 已提交
433
    pub fn is_finite(self) -> bool {
434 435
        // There's no need to handle NaN separately: if self is NaN,
        // the comparison is not true, exactly as desired.
436
        self.abs_private() < Self::INFINITY
S
Simon Sapin 已提交
437
    }
438 439

    /// Returns `true` if the number is neither zero, infinite,
M
Matthew Kraai 已提交
440
    /// [subnormal], or `NaN`.
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
    ///
    /// ```
    /// 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 已提交
460 461 462
    pub fn is_normal(self) -> bool {
        self.classify() == FpCategory::Normal
    }
463 464 465 466 467 468 469 470 471 472 473 474 475 476 477

    /// 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 已提交
478 479 480 481 482 483 484 485 486 487 488 489 490
    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,
        }
    }
491

A
Alexander Regueiro 已提交
492
    /// Returns `true` if `self` has a positive sign, including `+0.0`, `NaN`s with
493 494 495 496 497 498 499 500 501 502 503
    /// 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 已提交
504 505 506
    pub fn is_sign_positive(self) -> bool {
        !self.is_sign_negative()
    }
507 508 509 510 511

    #[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 已提交
512 513 514
    pub fn is_positive(self) -> bool {
        self.is_sign_positive()
    }
515

A
Alexander Regueiro 已提交
516
    /// Returns `true` if `self` has a negative sign, including `-0.0`, `NaN`s with
517 518 519 520 521 522 523 524 525 526 527
    /// 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 已提交
528 529 530
    pub fn is_sign_negative(self) -> bool {
        self.to_bits() & 0x8000_0000_0000_0000 != 0
    }
531 532 533 534 535

    #[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 已提交
536 537 538
    pub fn is_negative(self) -> bool {
        self.is_sign_negative()
    }
539 540 541 542 543

    /// Takes the reciprocal (inverse) of a number, `1/x`.
    ///
    /// ```
    /// let x = 2.0_f64;
544
    /// let abs_difference = (x.recip() - (1.0 / x)).abs();
545 546 547 548 549
    ///
    /// assert!(abs_difference < 1e-10);
    /// ```
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
S
Simon Sapin 已提交
550 551 552
    pub fn recip(self) -> f64 {
        1.0 / self
    }
553 554 555 556

    /// Converts radians to degrees.
    ///
    /// ```
557
    /// let angle = std::f64::consts::PI;
558 559 560 561 562 563 564
    ///
    /// 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 已提交
565 566 567 568 569 570
    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)
    }
571 572 573 574 575 576

    /// Converts degrees to radians.
    ///
    /// ```
    /// let angle = 180.0_f64;
    ///
577
    /// let abs_difference = (angle.to_radians() - std::f64::consts::PI).abs();
578 579 580 581 582
    ///
    /// assert!(abs_difference < 1e-10);
    /// ```
    #[stable(feature = "rust1", since = "1.0.0")]
    #[inline]
S
Simon Sapin 已提交
583 584 585 586
    pub fn to_radians(self) -> f64 {
        let value: f64 = consts::PI;
        self * (value / 180.0)
    }
587 588 589 590 591 592 593 594 595 596 597 598 599 600

    /// 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 {
601
        intrinsics::maxnumf64(self, other)
602 603 604 605 606 607 608 609 610 611 612 613 614 615 616
    }

    /// 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 {
617
        intrinsics::minnumf64(self, other)
618 619
    }

620 621 622 623
    /// Rounds toward zero and converts to any primitive integer type,
    /// assuming that the value is finite and fits in that type.
    ///
    /// ```
S
Steve Klabnik 已提交
624
    /// let value = 4.6_f64;
625
    /// let rounded = unsafe { value.to_int_unchecked::<u16>() };
626 627
    /// assert_eq!(rounded, 4);
    ///
S
Steve Klabnik 已提交
628
    /// let value = -128.9_f64;
629
    /// let rounded = unsafe { value.to_int_unchecked::<i8>() };
630
    /// assert_eq!(rounded, i8::MIN);
631 632 633 634 635 636 637 638 639
    /// ```
    ///
    /// # Safety
    ///
    /// The value must:
    ///
    /// * Not be `NaN`
    /// * Not be infinite
    /// * Be representable in the return type `Int`, after truncating off its fractional part
640
    #[stable(feature = "float_approx_unchecked_to", since = "1.44.0")]
641
    #[inline]
642
    pub unsafe fn to_int_unchecked<Int>(self) -> Int
643 644 645
    where
        Self: FloatToInt<Int>,
    {
646
        FloatToInt::<Int>::to_int_unchecked(self)
647 648
    }

649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
    /// 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 {
669
        // SAFETY: `u64` is a plain old datatype so we can always transmute to it
S
Simon Sapin 已提交
670
        unsafe { mem::transmute(self) }
671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706
    }

    /// 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);
707
    /// assert_eq!(v, 12.5);
708 709 710 711
    /// ```
    #[stable(feature = "float_bits_conv", since = "1.20.0")]
    #[inline]
    pub fn from_bits(v: u64) -> Self {
712
        // SAFETY: `u64` is a plain old datatype so we can always transmute from it
S
Simon Sapin 已提交
713 714
        // It turns out the safety issues with sNaN were overblown! Hooray!
        unsafe { mem::transmute(v) }
715
    }
716

717 718 719 720 721 722 723 724 725
    /// 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 已提交
726
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
727 728 729 730 731
    #[inline]
    pub fn to_be_bytes(self) -> [u8; 8] {
        self.to_bits().to_be_bytes()
    }

732 733 734 735 736 737 738 739 740
    /// 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 已提交
741
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
742 743 744 745 746
    #[inline]
    pub fn to_le_bytes(self) -> [u8; 8] {
        self.to_bits().to_le_bytes()
    }

747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768
    /// 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 已提交
769
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
770 771 772 773 774
    #[inline]
    pub fn to_ne_bytes(self) -> [u8; 8] {
        self.to_bits().to_ne_bytes()
    }

775 776 777 778 779 780 781 782
    /// 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 已提交
783
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
784 785 786 787 788
    #[inline]
    pub fn from_be_bytes(bytes: [u8; 8]) -> Self {
        Self::from_bits(u64::from_be_bytes(bytes))
    }

789
    /// Create a floating point value from its representation as a byte array in little endian.
790 791 792 793 794 795 796
    ///
    /// # Examples
    ///
    /// ```
    /// let value = f64::from_le_bytes([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40]);
    /// assert_eq!(value, 12.5);
    /// ```
L
Lzu Tao 已提交
797
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
798 799 800 801 802
    #[inline]
    pub fn from_le_bytes(bytes: [u8; 8]) -> Self {
        Self::from_bits(u64::from_le_bytes(bytes))
    }

803
    /// Create a floating point value from its representation as a byte array in native endian.
804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821
    ///
    /// 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 已提交
822
    #[stable(feature = "float_to_from_bytes", since = "1.40.0")]
823 824 825 826
    #[inline]
    pub fn from_ne_bytes(bytes: [u8; 8]) -> Self {
        Self::from_bits(u64::from_ne_bytes(bytes))
    }
827
}