implement ceil
This commit is contained in:
@@ -349,7 +349,6 @@ impl F32Ext for f32 {
|
|||||||
pub trait F64Ext: private::Sealed {
|
pub trait F64Ext: private::Sealed {
|
||||||
fn floor(self) -> Self;
|
fn floor(self) -> Self;
|
||||||
|
|
||||||
#[cfg(todo)]
|
|
||||||
fn ceil(self) -> Self;
|
fn ceil(self) -> Self;
|
||||||
|
|
||||||
fn round(self) -> Self;
|
fn round(self) -> Self;
|
||||||
@@ -457,7 +456,6 @@ impl F64Ext for f64 {
|
|||||||
floor(self)
|
floor(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(todo)]
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn ceil(self) -> Self {
|
fn ceil(self) -> Self {
|
||||||
ceil(self)
|
ceil(self)
|
||||||
|
|||||||
39
library/compiler-builtins/libm/src/math/ceil.rs
Normal file
39
library/compiler-builtins/libm/src/math/ceil.rs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
use core::f64;
|
||||||
|
|
||||||
|
const TOINT: f64 = 1. / f64::EPSILON;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn ceil(x: f64) -> f64 {
|
||||||
|
let u: u64 = x.to_bits();
|
||||||
|
let e: i64 = (u >> 52 & 0x7ff) as i64;
|
||||||
|
let y: f64;
|
||||||
|
|
||||||
|
if e >= 0x3ff + 52 || x == 0. {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
// y = int(x) - x, where int(x) is an integer neighbor of x
|
||||||
|
y = if (u >> 63) != 0 {
|
||||||
|
x - TOINT + TOINT - x
|
||||||
|
} else {
|
||||||
|
x + TOINT - TOINT - x
|
||||||
|
};
|
||||||
|
// special case because of non-nearest rounding modes
|
||||||
|
if e <= 0x3ff - 1 {
|
||||||
|
force_eval!(y);
|
||||||
|
return if (u >> 63) != 0 { -0. } else { 1. };
|
||||||
|
}
|
||||||
|
if y < 0. {
|
||||||
|
x + y + 1.
|
||||||
|
} else {
|
||||||
|
x + y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn sanity_check() {
|
||||||
|
assert_eq!(super::ceil(1.1), 2.0);
|
||||||
|
assert_eq!(super::ceil(2.9), 3.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ macro_rules! force_eval {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod ceil;
|
||||||
mod ceilf;
|
mod ceilf;
|
||||||
mod expf;
|
mod expf;
|
||||||
mod fabs;
|
mod fabs;
|
||||||
@@ -36,10 +37,11 @@ mod truncf;
|
|||||||
//mod service;
|
//mod service;
|
||||||
|
|
||||||
pub use self::{
|
pub use self::{
|
||||||
ceilf::ceilf, expf::expf, fabs::fabs, fabsf::fabsf, floor::floor, floorf::floorf, fmodf::fmodf,
|
ceil::ceil, ceilf::ceilf, expf::expf, fabs::fabs, fabsf::fabsf, floor::floor, floorf::floorf,
|
||||||
hypot::hypot, hypotf::hypotf, log::log, log10::log10, log10f::log10f, log1p::log1p,
|
fmodf::fmodf, hypot::hypot, hypotf::hypotf, log::log, log10::log10, log10f::log10f,
|
||||||
log1pf::log1pf, log2::log2, log2f::log2f, logf::logf, powf::powf, round::round, roundf::roundf,
|
log1p::log1p, log1pf::log1pf, log2::log2, log2f::log2f, logf::logf, powf::powf, round::round,
|
||||||
scalbn::scalbn, scalbnf::scalbnf, sqrt::sqrt, sqrtf::sqrtf, trunc::trunc, truncf::truncf,
|
roundf::roundf, scalbn::scalbn, scalbnf::scalbnf, sqrt::sqrt, sqrtf::sqrtf, trunc::trunc,
|
||||||
|
truncf::truncf,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn isnanf(x: f32) -> bool {
|
fn isnanf(x: f32) -> bool {
|
||||||
|
|||||||
Reference in New Issue
Block a user