mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
float types: move copysign, abs, signum to libcore
This commit is contained in:
parent
a8e1186e3c
commit
e8dfe6e4f2
@ -1282,4 +1282,102 @@ impl f128 {
|
||||
}
|
||||
self
|
||||
}
|
||||
|
||||
/// Computes the absolute value of `self`.
|
||||
///
|
||||
/// This function always returns the precise result.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f128)]
|
||||
/// # #[cfg(reliable_f128)] {
|
||||
///
|
||||
/// let x = 3.5_f128;
|
||||
/// let y = -3.5_f128;
|
||||
///
|
||||
/// assert_eq!(x.abs(), x);
|
||||
/// assert_eq!(y.abs(), -y);
|
||||
///
|
||||
/// assert!(f128::NAN.abs().is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f128", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn abs(self) -> Self {
|
||||
// FIXME(f16_f128): replace with `intrinsics::fabsf128` when available
|
||||
// We don't do this now because LLVM has lowering bugs for f128 math.
|
||||
Self::from_bits(self.to_bits() & !(1 << 127))
|
||||
}
|
||||
|
||||
/// Returns a number that represents the sign of `self`.
|
||||
///
|
||||
/// - `1.0` if the number is positive, `+0.0` or `INFINITY`
|
||||
/// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
|
||||
/// - NaN if the number is NaN
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f128)]
|
||||
/// # #[cfg(reliable_f128_math)] {
|
||||
///
|
||||
/// let f = 3.5_f128;
|
||||
///
|
||||
/// assert_eq!(f.signum(), 1.0);
|
||||
/// assert_eq!(f128::NEG_INFINITY.signum(), -1.0);
|
||||
///
|
||||
/// assert!(f128::NAN.signum().is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f128", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn signum(self) -> f128 {
|
||||
if self.is_nan() { Self::NAN } else { 1.0_f128.copysign(self) }
|
||||
}
|
||||
|
||||
/// Returns a number composed of the magnitude of `self` and the sign of
|
||||
/// `sign`.
|
||||
///
|
||||
/// Equal to `self` if the sign of `self` and `sign` are the same, otherwise equal to `-self`.
|
||||
/// If `self` is a NaN, then a NaN with the same payload as `self` and the sign bit of `sign` is
|
||||
/// returned.
|
||||
///
|
||||
/// If `sign` is a NaN, then this operation will still carry over its sign into the result. Note
|
||||
/// that IEEE 754 doesn't assign any meaning to the sign bit in case of a NaN, and as Rust
|
||||
/// doesn't guarantee that the bit pattern of NaNs are conserved over arithmetic operations, the
|
||||
/// result of `copysign` with `sign` being a NaN might produce an unexpected or non-portable
|
||||
/// result. See the [specification of NaN bit patterns](primitive@f32#nan-bit-patterns) for more
|
||||
/// info.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f128)]
|
||||
/// # #[cfg(reliable_f128_math)] {
|
||||
///
|
||||
/// let f = 3.5_f128;
|
||||
///
|
||||
/// assert_eq!(f.copysign(0.42), 3.5_f128);
|
||||
/// assert_eq!(f.copysign(-0.42), -3.5_f128);
|
||||
/// assert_eq!((-f).copysign(0.42), 3.5_f128);
|
||||
/// assert_eq!((-f).copysign(-0.42), -3.5_f128);
|
||||
///
|
||||
/// assert!(f128::NAN.copysign(1.0).is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f128", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn copysign(self, sign: f128) -> f128 {
|
||||
unsafe { intrinsics::copysignf128(self, sign) }
|
||||
}
|
||||
}
|
||||
|
@ -1257,4 +1257,101 @@ impl f16 {
|
||||
}
|
||||
self
|
||||
}
|
||||
|
||||
/// Computes the absolute value of `self`.
|
||||
///
|
||||
/// This function always returns the precise result.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f16)]
|
||||
/// # #[cfg(reliable_f16)] {
|
||||
///
|
||||
/// let x = 3.5_f16;
|
||||
/// let y = -3.5_f16;
|
||||
///
|
||||
/// assert_eq!(x.abs(), x);
|
||||
/// assert_eq!(y.abs(), -y);
|
||||
///
|
||||
/// assert!(f16::NAN.abs().is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f16", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn abs(self) -> Self {
|
||||
// FIXME(f16_f128): replace with `intrinsics::fabsf16` when available
|
||||
Self::from_bits(self.to_bits() & !(1 << 15))
|
||||
}
|
||||
|
||||
/// Returns a number that represents the sign of `self`.
|
||||
///
|
||||
/// - `1.0` if the number is positive, `+0.0` or `INFINITY`
|
||||
/// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
|
||||
/// - NaN if the number is NaN
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f16)]
|
||||
/// # #[cfg(reliable_f16_math)] {
|
||||
///
|
||||
/// let f = 3.5_f16;
|
||||
///
|
||||
/// assert_eq!(f.signum(), 1.0);
|
||||
/// assert_eq!(f16::NEG_INFINITY.signum(), -1.0);
|
||||
///
|
||||
/// assert!(f16::NAN.signum().is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f16", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn signum(self) -> f16 {
|
||||
if self.is_nan() { Self::NAN } else { 1.0_f16.copysign(self) }
|
||||
}
|
||||
|
||||
/// Returns a number composed of the magnitude of `self` and the sign of
|
||||
/// `sign`.
|
||||
///
|
||||
/// Equal to `self` if the sign of `self` and `sign` are the same, otherwise equal to `-self`.
|
||||
/// If `self` is a NaN, then a NaN with the same payload as `self` and the sign bit of `sign` is
|
||||
/// returned.
|
||||
///
|
||||
/// If `sign` is a NaN, then this operation will still carry over its sign into the result. Note
|
||||
/// that IEEE 754 doesn't assign any meaning to the sign bit in case of a NaN, and as Rust
|
||||
/// doesn't guarantee that the bit pattern of NaNs are conserved over arithmetic operations, the
|
||||
/// result of `copysign` with `sign` being a NaN might produce an unexpected or non-portable
|
||||
/// result. See the [specification of NaN bit patterns](primitive@f32#nan-bit-patterns) for more
|
||||
/// info.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f16)]
|
||||
/// # #[cfg(reliable_f16_math)] {
|
||||
///
|
||||
/// let f = 3.5_f16;
|
||||
///
|
||||
/// assert_eq!(f.copysign(0.42), 3.5_f16);
|
||||
/// assert_eq!(f.copysign(-0.42), -3.5_f16);
|
||||
/// assert_eq!((-f).copysign(0.42), 3.5_f16);
|
||||
/// assert_eq!((-f).copysign(-0.42), -3.5_f16);
|
||||
///
|
||||
/// assert!(f16::NAN.copysign(1.0).is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f16", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn copysign(self, sign: f16) -> f16 {
|
||||
unsafe { intrinsics::copysignf16(self, sign) }
|
||||
}
|
||||
}
|
||||
|
@ -1427,4 +1427,88 @@ impl f32 {
|
||||
}
|
||||
self
|
||||
}
|
||||
|
||||
/// Computes the absolute value of `self`.
|
||||
///
|
||||
/// This function always returns the precise result.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let x = 3.5_f32;
|
||||
/// let y = -3.5_f32;
|
||||
///
|
||||
/// assert_eq!(x.abs(), x);
|
||||
/// assert_eq!(y.abs(), -y);
|
||||
///
|
||||
/// assert!(f32::NAN.abs().is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[inline]
|
||||
pub const fn abs(self) -> f32 {
|
||||
unsafe { intrinsics::fabsf32(self) }
|
||||
}
|
||||
|
||||
/// Returns a number that represents the sign of `self`.
|
||||
///
|
||||
/// - `1.0` if the number is positive, `+0.0` or `INFINITY`
|
||||
/// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
|
||||
/// - NaN if the number is NaN
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let f = 3.5_f32;
|
||||
///
|
||||
/// assert_eq!(f.signum(), 1.0);
|
||||
/// assert_eq!(f32::NEG_INFINITY.signum(), -1.0);
|
||||
///
|
||||
/// assert!(f32::NAN.signum().is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[inline]
|
||||
pub const fn signum(self) -> f32 {
|
||||
if self.is_nan() { Self::NAN } else { 1.0_f32.copysign(self) }
|
||||
}
|
||||
|
||||
/// Returns a number composed of the magnitude of `self` and the sign of
|
||||
/// `sign`.
|
||||
///
|
||||
/// Equal to `self` if the sign of `self` and `sign` are the same, otherwise equal to `-self`.
|
||||
/// If `self` is a NaN, then a NaN with the same payload as `self` and the sign bit of `sign` is
|
||||
/// returned.
|
||||
///
|
||||
/// If `sign` is a NaN, then this operation will still carry over its sign into the result. Note
|
||||
/// that IEEE 754 doesn't assign any meaning to the sign bit in case of a NaN, and as Rust
|
||||
/// doesn't guarantee that the bit pattern of NaNs are conserved over arithmetic operations, the
|
||||
/// result of `copysign` with `sign` being a NaN might produce an unexpected or non-portable
|
||||
/// result. See the [specification of NaN bit patterns](primitive@f32#nan-bit-patterns) for more
|
||||
/// info.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let f = 3.5_f32;
|
||||
///
|
||||
/// assert_eq!(f.copysign(0.42), 3.5_f32);
|
||||
/// assert_eq!(f.copysign(-0.42), -3.5_f32);
|
||||
/// assert_eq!((-f).copysign(0.42), 3.5_f32);
|
||||
/// assert_eq!((-f).copysign(-0.42), -3.5_f32);
|
||||
///
|
||||
/// assert!(f32::NAN.copysign(1.0).is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[inline]
|
||||
#[stable(feature = "copysign", since = "1.35.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
pub const fn copysign(self, sign: f32) -> f32 {
|
||||
unsafe { intrinsics::copysignf32(self, sign) }
|
||||
}
|
||||
}
|
||||
|
@ -1427,4 +1427,88 @@ impl f64 {
|
||||
}
|
||||
self
|
||||
}
|
||||
|
||||
/// Computes the absolute value of `self`.
|
||||
///
|
||||
/// This function always returns the precise result.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let x = 3.5_f64;
|
||||
/// let y = -3.5_f64;
|
||||
///
|
||||
/// assert_eq!(x.abs(), x);
|
||||
/// assert_eq!(y.abs(), -y);
|
||||
///
|
||||
/// assert!(f64::NAN.abs().is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[inline]
|
||||
pub const fn abs(self) -> f64 {
|
||||
unsafe { intrinsics::fabsf64(self) }
|
||||
}
|
||||
|
||||
/// Returns a number that represents the sign of `self`.
|
||||
///
|
||||
/// - `1.0` if the number is positive, `+0.0` or `INFINITY`
|
||||
/// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
|
||||
/// - NaN if the number is NaN
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let f = 3.5_f64;
|
||||
///
|
||||
/// assert_eq!(f.signum(), 1.0);
|
||||
/// assert_eq!(f64::NEG_INFINITY.signum(), -1.0);
|
||||
///
|
||||
/// assert!(f64::NAN.signum().is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[inline]
|
||||
pub const fn signum(self) -> f64 {
|
||||
if self.is_nan() { Self::NAN } else { 1.0_f64.copysign(self) }
|
||||
}
|
||||
|
||||
/// Returns a number composed of the magnitude of `self` and the sign of
|
||||
/// `sign`.
|
||||
///
|
||||
/// Equal to `self` if the sign of `self` and `sign` are the same, otherwise equal to `-self`.
|
||||
/// If `self` is a NaN, then a NaN with the same payload as `self` and the sign bit of `sign` is
|
||||
/// returned.
|
||||
///
|
||||
/// If `sign` is a NaN, then this operation will still carry over its sign into the result. Note
|
||||
/// that IEEE 754 doesn't assign any meaning to the sign bit in case of a NaN, and as Rust
|
||||
/// doesn't guarantee that the bit pattern of NaNs are conserved over arithmetic operations, the
|
||||
/// result of `copysign` with `sign` being a NaN might produce an unexpected or non-portable
|
||||
/// result. See the [specification of NaN bit patterns](primitive@f32#nan-bit-patterns) for more
|
||||
/// info.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let f = 3.5_f64;
|
||||
///
|
||||
/// assert_eq!(f.copysign(0.42), 3.5_f64);
|
||||
/// assert_eq!(f.copysign(-0.42), -3.5_f64);
|
||||
/// assert_eq!((-f).copysign(0.42), 3.5_f64);
|
||||
/// assert_eq!((-f).copysign(-0.42), -3.5_f64);
|
||||
///
|
||||
/// assert!(f64::NAN.copysign(1.0).is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "copysign", since = "1.35.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[inline]
|
||||
pub const fn copysign(self, sign: f64) -> f64 {
|
||||
unsafe { intrinsics::copysignf64(self, sign) }
|
||||
}
|
||||
}
|
||||
|
@ -188,104 +188,6 @@ impl f128 {
|
||||
self - self.trunc()
|
||||
}
|
||||
|
||||
/// Computes the absolute value of `self`.
|
||||
///
|
||||
/// This function always returns the precise result.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f128)]
|
||||
/// # #[cfg(reliable_f128)] {
|
||||
///
|
||||
/// let x = 3.5_f128;
|
||||
/// let y = -3.5_f128;
|
||||
///
|
||||
/// assert_eq!(x.abs(), x);
|
||||
/// assert_eq!(y.abs(), -y);
|
||||
///
|
||||
/// assert!(f128::NAN.abs().is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f128", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn abs(self) -> Self {
|
||||
// FIXME(f16_f128): replace with `intrinsics::fabsf128` when available
|
||||
// We don't do this now because LLVM has lowering bugs for f128 math.
|
||||
Self::from_bits(self.to_bits() & !(1 << 127))
|
||||
}
|
||||
|
||||
/// Returns a number that represents the sign of `self`.
|
||||
///
|
||||
/// - `1.0` if the number is positive, `+0.0` or `INFINITY`
|
||||
/// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
|
||||
/// - NaN if the number is NaN
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f128)]
|
||||
/// # #[cfg(reliable_f128_math)] {
|
||||
///
|
||||
/// let f = 3.5_f128;
|
||||
///
|
||||
/// assert_eq!(f.signum(), 1.0);
|
||||
/// assert_eq!(f128::NEG_INFINITY.signum(), -1.0);
|
||||
///
|
||||
/// assert!(f128::NAN.signum().is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f128", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn signum(self) -> f128 {
|
||||
if self.is_nan() { Self::NAN } else { 1.0_f128.copysign(self) }
|
||||
}
|
||||
|
||||
/// Returns a number composed of the magnitude of `self` and the sign of
|
||||
/// `sign`.
|
||||
///
|
||||
/// Equal to `self` if the sign of `self` and `sign` are the same, otherwise equal to `-self`.
|
||||
/// If `self` is a NaN, then a NaN with the same payload as `self` and the sign bit of `sign` is
|
||||
/// returned.
|
||||
///
|
||||
/// If `sign` is a NaN, then this operation will still carry over its sign into the result. Note
|
||||
/// that IEEE 754 doesn't assign any meaning to the sign bit in case of a NaN, and as Rust
|
||||
/// doesn't guarantee that the bit pattern of NaNs are conserved over arithmetic operations, the
|
||||
/// result of `copysign` with `sign` being a NaN might produce an unexpected or non-portable
|
||||
/// result. See the [specification of NaN bit patterns](primitive@f32#nan-bit-patterns) for more
|
||||
/// info.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f128)]
|
||||
/// # #[cfg(reliable_f128_math)] {
|
||||
///
|
||||
/// let f = 3.5_f128;
|
||||
///
|
||||
/// assert_eq!(f.copysign(0.42), 3.5_f128);
|
||||
/// assert_eq!(f.copysign(-0.42), -3.5_f128);
|
||||
/// assert_eq!((-f).copysign(0.42), 3.5_f128);
|
||||
/// assert_eq!((-f).copysign(-0.42), -3.5_f128);
|
||||
///
|
||||
/// assert!(f128::NAN.copysign(1.0).is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f128", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn copysign(self, sign: f128) -> f128 {
|
||||
unsafe { intrinsics::copysignf128(self, sign) }
|
||||
}
|
||||
|
||||
/// Fused multiply-add. Computes `(self * a) + b` with only one rounding
|
||||
/// error, yielding a more accurate result than an unfused multiply-add.
|
||||
///
|
||||
|
@ -188,103 +188,6 @@ impl f16 {
|
||||
self - self.trunc()
|
||||
}
|
||||
|
||||
/// Computes the absolute value of `self`.
|
||||
///
|
||||
/// This function always returns the precise result.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f16)]
|
||||
/// # #[cfg(reliable_f16)] {
|
||||
///
|
||||
/// let x = 3.5_f16;
|
||||
/// let y = -3.5_f16;
|
||||
///
|
||||
/// assert_eq!(x.abs(), x);
|
||||
/// assert_eq!(y.abs(), -y);
|
||||
///
|
||||
/// assert!(f16::NAN.abs().is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f16", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn abs(self) -> Self {
|
||||
// FIXME(f16_f128): replace with `intrinsics::fabsf16` when available
|
||||
Self::from_bits(self.to_bits() & !(1 << 15))
|
||||
}
|
||||
|
||||
/// Returns a number that represents the sign of `self`.
|
||||
///
|
||||
/// - `1.0` if the number is positive, `+0.0` or `INFINITY`
|
||||
/// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
|
||||
/// - NaN if the number is NaN
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f16)]
|
||||
/// # #[cfg(reliable_f16_math)] {
|
||||
///
|
||||
/// let f = 3.5_f16;
|
||||
///
|
||||
/// assert_eq!(f.signum(), 1.0);
|
||||
/// assert_eq!(f16::NEG_INFINITY.signum(), -1.0);
|
||||
///
|
||||
/// assert!(f16::NAN.signum().is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f16", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn signum(self) -> f16 {
|
||||
if self.is_nan() { Self::NAN } else { 1.0_f16.copysign(self) }
|
||||
}
|
||||
|
||||
/// Returns a number composed of the magnitude of `self` and the sign of
|
||||
/// `sign`.
|
||||
///
|
||||
/// Equal to `self` if the sign of `self` and `sign` are the same, otherwise equal to `-self`.
|
||||
/// If `self` is a NaN, then a NaN with the same payload as `self` and the sign bit of `sign` is
|
||||
/// returned.
|
||||
///
|
||||
/// If `sign` is a NaN, then this operation will still carry over its sign into the result. Note
|
||||
/// that IEEE 754 doesn't assign any meaning to the sign bit in case of a NaN, and as Rust
|
||||
/// doesn't guarantee that the bit pattern of NaNs are conserved over arithmetic operations, the
|
||||
/// result of `copysign` with `sign` being a NaN might produce an unexpected or non-portable
|
||||
/// result. See the [specification of NaN bit patterns](primitive@f32#nan-bit-patterns) for more
|
||||
/// info.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(f16)]
|
||||
/// # #[cfg(reliable_f16_math)] {
|
||||
///
|
||||
/// let f = 3.5_f16;
|
||||
///
|
||||
/// assert_eq!(f.copysign(0.42), 3.5_f16);
|
||||
/// assert_eq!(f.copysign(-0.42), -3.5_f16);
|
||||
/// assert_eq!((-f).copysign(0.42), 3.5_f16);
|
||||
/// assert_eq!((-f).copysign(-0.42), -3.5_f16);
|
||||
///
|
||||
/// assert!(f16::NAN.copysign(1.0).is_nan());
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[unstable(feature = "f16", issue = "116909")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
pub const fn copysign(self, sign: f16) -> f16 {
|
||||
unsafe { intrinsics::copysignf16(self, sign) }
|
||||
}
|
||||
|
||||
/// Fused multiply-add. Computes `(self * a) + b` with only one rounding
|
||||
/// error, yielding a more accurate result than an unfused multiply-add.
|
||||
///
|
||||
|
@ -176,90 +176,6 @@ impl f32 {
|
||||
self - self.trunc()
|
||||
}
|
||||
|
||||
/// Computes the absolute value of `self`.
|
||||
///
|
||||
/// This function always returns the precise result.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let x = 3.5_f32;
|
||||
/// let y = -3.5_f32;
|
||||
///
|
||||
/// assert_eq!(x.abs(), x);
|
||||
/// assert_eq!(y.abs(), -y);
|
||||
///
|
||||
/// assert!(f32::NAN.abs().is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[inline]
|
||||
pub const fn abs(self) -> f32 {
|
||||
unsafe { intrinsics::fabsf32(self) }
|
||||
}
|
||||
|
||||
/// Returns a number that represents the sign of `self`.
|
||||
///
|
||||
/// - `1.0` if the number is positive, `+0.0` or `INFINITY`
|
||||
/// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
|
||||
/// - NaN if the number is NaN
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let f = 3.5_f32;
|
||||
///
|
||||
/// assert_eq!(f.signum(), 1.0);
|
||||
/// assert_eq!(f32::NEG_INFINITY.signum(), -1.0);
|
||||
///
|
||||
/// assert!(f32::NAN.signum().is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[inline]
|
||||
pub const fn signum(self) -> f32 {
|
||||
if self.is_nan() { Self::NAN } else { 1.0_f32.copysign(self) }
|
||||
}
|
||||
|
||||
/// Returns a number composed of the magnitude of `self` and the sign of
|
||||
/// `sign`.
|
||||
///
|
||||
/// Equal to `self` if the sign of `self` and `sign` are the same, otherwise equal to `-self`.
|
||||
/// If `self` is a NaN, then a NaN with the same payload as `self` and the sign bit of `sign` is
|
||||
/// returned.
|
||||
///
|
||||
/// If `sign` is a NaN, then this operation will still carry over its sign into the result. Note
|
||||
/// that IEEE 754 doesn't assign any meaning to the sign bit in case of a NaN, and as Rust
|
||||
/// doesn't guarantee that the bit pattern of NaNs are conserved over arithmetic operations, the
|
||||
/// result of `copysign` with `sign` being a NaN might produce an unexpected or non-portable
|
||||
/// result. See the [specification of NaN bit patterns](primitive@f32#nan-bit-patterns) for more
|
||||
/// info.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let f = 3.5_f32;
|
||||
///
|
||||
/// assert_eq!(f.copysign(0.42), 3.5_f32);
|
||||
/// assert_eq!(f.copysign(-0.42), -3.5_f32);
|
||||
/// assert_eq!((-f).copysign(0.42), 3.5_f32);
|
||||
/// assert_eq!((-f).copysign(-0.42), -3.5_f32);
|
||||
///
|
||||
/// assert!(f32::NAN.copysign(1.0).is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[inline]
|
||||
#[stable(feature = "copysign", since = "1.35.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
pub const fn copysign(self, sign: f32) -> f32 {
|
||||
unsafe { intrinsics::copysignf32(self, sign) }
|
||||
}
|
||||
|
||||
/// Fused multiply-add. Computes `(self * a) + b` with only one rounding
|
||||
/// error, yielding a more accurate result than an unfused multiply-add.
|
||||
///
|
||||
|
@ -176,90 +176,6 @@ impl f64 {
|
||||
self - self.trunc()
|
||||
}
|
||||
|
||||
/// Computes the absolute value of `self`.
|
||||
///
|
||||
/// This function always returns the precise result.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let x = 3.5_f64;
|
||||
/// let y = -3.5_f64;
|
||||
///
|
||||
/// assert_eq!(x.abs(), x);
|
||||
/// assert_eq!(y.abs(), -y);
|
||||
///
|
||||
/// assert!(f64::NAN.abs().is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[inline]
|
||||
pub const fn abs(self) -> f64 {
|
||||
unsafe { intrinsics::fabsf64(self) }
|
||||
}
|
||||
|
||||
/// Returns a number that represents the sign of `self`.
|
||||
///
|
||||
/// - `1.0` if the number is positive, `+0.0` or `INFINITY`
|
||||
/// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
|
||||
/// - NaN if the number is NaN
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let f = 3.5_f64;
|
||||
///
|
||||
/// assert_eq!(f.signum(), 1.0);
|
||||
/// assert_eq!(f64::NEG_INFINITY.signum(), -1.0);
|
||||
///
|
||||
/// assert!(f64::NAN.signum().is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[inline]
|
||||
pub const fn signum(self) -> f64 {
|
||||
if self.is_nan() { Self::NAN } else { 1.0_f64.copysign(self) }
|
||||
}
|
||||
|
||||
/// Returns a number composed of the magnitude of `self` and the sign of
|
||||
/// `sign`.
|
||||
///
|
||||
/// Equal to `self` if the sign of `self` and `sign` are the same, otherwise equal to `-self`.
|
||||
/// If `self` is a NaN, then a NaN with the same payload as `self` and the sign bit of `sign` is
|
||||
/// returned.
|
||||
///
|
||||
/// If `sign` is a NaN, then this operation will still carry over its sign into the result. Note
|
||||
/// that IEEE 754 doesn't assign any meaning to the sign bit in case of a NaN, and as Rust
|
||||
/// doesn't guarantee that the bit pattern of NaNs are conserved over arithmetic operations, the
|
||||
/// result of `copysign` with `sign` being a NaN might produce an unexpected or non-portable
|
||||
/// result. See the [specification of NaN bit patterns](primitive@f32#nan-bit-patterns) for more
|
||||
/// info.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let f = 3.5_f64;
|
||||
///
|
||||
/// assert_eq!(f.copysign(0.42), 3.5_f64);
|
||||
/// assert_eq!(f.copysign(-0.42), -3.5_f64);
|
||||
/// assert_eq!((-f).copysign(0.42), 3.5_f64);
|
||||
/// assert_eq!((-f).copysign(-0.42), -3.5_f64);
|
||||
///
|
||||
/// assert!(f64::NAN.copysign(1.0).is_nan());
|
||||
/// ```
|
||||
#[rustc_allow_incoherent_impl]
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "copysign", since = "1.35.0")]
|
||||
#[rustc_const_unstable(feature = "const_float_methods", issue = "130843")]
|
||||
#[inline]
|
||||
pub const fn copysign(self, sign: f64) -> f64 {
|
||||
unsafe { intrinsics::copysignf64(self, sign) }
|
||||
}
|
||||
|
||||
/// Fused multiply-add. Computes `(self * a) + b` with only one rounding
|
||||
/// error, yielding a more accurate result than an unfused multiply-add.
|
||||
///
|
||||
|
Loading…
Reference in New Issue
Block a user