implement ceil

This commit is contained in:
Lucas Marques
2018-07-14 00:23:58 -03:00
parent 965c736cc1
commit 5c2409fcca
3 changed files with 45 additions and 6 deletions

View File

@@ -349,7 +349,6 @@ impl F32Ext for f32 {
pub trait F64Ext: private::Sealed {
fn floor(self) -> Self;
#[cfg(todo)]
fn ceil(self) -> Self;
fn round(self) -> Self;
@@ -457,7 +456,6 @@ impl F64Ext for f64 {
floor(self)
}
#[cfg(todo)]
#[inline]
fn ceil(self) -> Self {
ceil(self)

View 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);
}
}

View File

@@ -6,6 +6,7 @@ macro_rules! force_eval {
};
}
mod ceil;
mod ceilf;
mod expf;
mod fabs;
@@ -36,10 +37,11 @@ mod truncf;
//mod service;
pub use self::{
ceilf::ceilf, expf::expf, fabs::fabs, fabsf::fabsf, floor::floor, floorf::floorf, fmodf::fmodf,
hypot::hypot, hypotf::hypotf, log::log, log10::log10, log10f::log10f, log1p::log1p,
log1pf::log1pf, log2::log2, log2f::log2f, logf::logf, powf::powf, round::round, roundf::roundf,
scalbn::scalbn, scalbnf::scalbnf, sqrt::sqrt, sqrtf::sqrtf, trunc::trunc, truncf::truncf,
ceil::ceil, ceilf::ceilf, expf::expf, fabs::fabs, fabsf::fabsf, floor::floor, floorf::floorf,
fmodf::fmodf, hypot::hypot, hypotf::hypotf, log::log, log10::log10, log10f::log10f,
log1p::log1p, log1pf::log1pf, log2::log2, log2f::log2f, logf::logf, powf::powf, round::round,
roundf::roundf, scalbn::scalbn, scalbnf::scalbnf, sqrt::sqrt, sqrtf::sqrtf, trunc::trunc,
truncf::truncf,
};
fn isnanf(x: f32) -> bool {