This adds everything that was directly or transitively blocked on const arithmetic for these types, which was recently merged. Since const arithmetic is recent, most of these need to be gated by `bootstrap`. Anything that relies on intrinsics that are still missing is excluded.
65 lines
1.9 KiB
Rust
65 lines
1.9 KiB
Rust
//! Constants for the `f16` double-precision floating point type.
|
|
//!
|
|
//! *[See also the `f16` primitive type](primitive@f16).*
|
|
//!
|
|
//! Mathematically significant numbers are provided in the `consts` sub-module.
|
|
|
|
#[cfg(test)]
|
|
mod tests;
|
|
|
|
#[cfg(not(test))]
|
|
use crate::intrinsics;
|
|
|
|
#[unstable(feature = "f16", issue = "116909")]
|
|
pub use core::f16::consts;
|
|
|
|
#[cfg(not(test))]
|
|
impl f16 {
|
|
/// Raises a number to an integer power.
|
|
///
|
|
/// Using this function is generally faster than using `powf`.
|
|
/// It might have a different sequence of rounding operations than `powf`,
|
|
/// so the results are not guaranteed to agree.
|
|
///
|
|
/// # Unspecified precision
|
|
///
|
|
/// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and
|
|
/// can even differ within the same execution from one invocation to the next.
|
|
#[inline]
|
|
#[rustc_allow_incoherent_impl]
|
|
#[unstable(feature = "f16", issue = "116909")]
|
|
#[must_use = "method returns a new number and does not mutate the original value"]
|
|
pub fn powi(self, n: i32) -> f16 {
|
|
unsafe { intrinsics::powif16(self, n) }
|
|
}
|
|
|
|
/// 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]
|
|
#[cfg(not(bootstrap))]
|
|
#[rustc_allow_incoherent_impl]
|
|
#[unstable(feature = "f16", issue = "116909")]
|
|
#[must_use = "method returns a new number and does not mutate the original value"]
|
|
pub fn abs(self) -> Self {
|
|
// FIXME(f16_f128): replace with `intrinsics::fabsf16` when available
|
|
Self::from_bits(self.to_bits() & !(1 << 15))
|
|
}
|
|
}
|