Add rounding methods to FloatCore
This commit is contained in:
parent
99c6cc11ba
commit
f365a4205f
80
src/float.rs
80
src/float.rs
|
@ -65,6 +65,76 @@ pub trait FloatCore: Num + NumCast + Neg<Output = Self> + PartialOrd + Copy {
|
||||||
/// predicate instead.
|
/// predicate instead.
|
||||||
fn classify(self) -> FpCategory;
|
fn classify(self) -> FpCategory;
|
||||||
|
|
||||||
|
/// Returns the largest integer less than or equal to a number.
|
||||||
|
#[inline]
|
||||||
|
fn floor(self) -> Self {
|
||||||
|
let f = self.fract();
|
||||||
|
if f.is_nan() || f.is_zero() {
|
||||||
|
self
|
||||||
|
} else if self < Self::zero() {
|
||||||
|
self - f - Self::one()
|
||||||
|
} else {
|
||||||
|
self - f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the smallest integer greater than or equal to a number.
|
||||||
|
#[inline]
|
||||||
|
fn ceil(self) -> Self {
|
||||||
|
let f = self.fract();
|
||||||
|
if f.is_nan() || f.is_zero() {
|
||||||
|
self
|
||||||
|
} else if self > Self::zero() {
|
||||||
|
self - f + Self::one()
|
||||||
|
} else {
|
||||||
|
self - f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the nearest integer to a number. Round half-way cases away from `0.0`.
|
||||||
|
#[inline]
|
||||||
|
fn round(self) -> Self {
|
||||||
|
let one = Self::one();
|
||||||
|
let h = Self::from(0.5).expect("Unable to cast from 0.5");
|
||||||
|
let f = self.fract();
|
||||||
|
if f.is_nan() || f.is_zero() {
|
||||||
|
self
|
||||||
|
} else if self > Self::zero() {
|
||||||
|
if f < h {
|
||||||
|
self - f
|
||||||
|
} else {
|
||||||
|
self - f + one
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if -f < h {
|
||||||
|
self - f
|
||||||
|
} else {
|
||||||
|
self - f - one
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the integer part of a number.
|
||||||
|
#[inline]
|
||||||
|
fn trunc(self) -> Self {
|
||||||
|
let f = self.fract();
|
||||||
|
if f.is_nan() {
|
||||||
|
self
|
||||||
|
} else {
|
||||||
|
self - f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the fractional part of a number.
|
||||||
|
#[inline]
|
||||||
|
fn fract(self) -> Self {
|
||||||
|
if self.is_zero() {
|
||||||
|
Self::zero()
|
||||||
|
} else {
|
||||||
|
self % Self::one()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Computes the absolute value of `self`. Returns `FloatCore::nan()` if the
|
/// Computes the absolute value of `self`. Returns `FloatCore::nan()` if the
|
||||||
/// number is `FloatCore::nan()`.
|
/// number is `FloatCore::nan()`.
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -238,6 +308,11 @@ impl FloatCore for f32 {
|
||||||
Self::is_finite(self) -> bool;
|
Self::is_finite(self) -> bool;
|
||||||
Self::is_normal(self) -> bool;
|
Self::is_normal(self) -> bool;
|
||||||
Self::classify(self) -> FpCategory;
|
Self::classify(self) -> FpCategory;
|
||||||
|
Self::floor(self) -> Self;
|
||||||
|
Self::ceil(self) -> Self;
|
||||||
|
Self::round(self) -> Self;
|
||||||
|
Self::trunc(self) -> Self;
|
||||||
|
Self::fract(self) -> Self;
|
||||||
Self::abs(self) -> Self;
|
Self::abs(self) -> Self;
|
||||||
Self::signum(self) -> Self;
|
Self::signum(self) -> Self;
|
||||||
Self::is_sign_positive(self) -> bool;
|
Self::is_sign_positive(self) -> bool;
|
||||||
|
@ -327,6 +402,11 @@ impl FloatCore for f64 {
|
||||||
Self::is_finite(self) -> bool;
|
Self::is_finite(self) -> bool;
|
||||||
Self::is_normal(self) -> bool;
|
Self::is_normal(self) -> bool;
|
||||||
Self::classify(self) -> FpCategory;
|
Self::classify(self) -> FpCategory;
|
||||||
|
Self::floor(self) -> Self;
|
||||||
|
Self::ceil(self) -> Self;
|
||||||
|
Self::round(self) -> Self;
|
||||||
|
Self::trunc(self) -> Self;
|
||||||
|
Self::fract(self) -> Self;
|
||||||
Self::abs(self) -> Self;
|
Self::abs(self) -> Self;
|
||||||
Self::signum(self) -> Self;
|
Self::signum(self) -> Self;
|
||||||
Self::is_sign_positive(self) -> bool;
|
Self::is_sign_positive(self) -> bool;
|
||||||
|
|
Loading…
Reference in New Issue