1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
use core::f32; const TOINT: f32 = 1.0 / f32::EPSILON; #[inline] #[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)] pub fn roundf(mut x: f32) -> f32 { let i = x.to_bits(); let e: u32 = i >> 23 & 0xff; let mut y: f32; if e >= 0x7f + 23 { return x; } if i >> 31 != 0 { x = -x; } if e < 0x7f - 1 { force_eval!(x + TOINT); return 0.0 * x; } y = x + TOINT - TOINT - x; if y > 0.5f32 { y = y + x - 1.0; } else if y <= -0.5f32 { y = y + x + 1.0; } else { y = y + x; } if i >> 31 != 0 { -y } else { y } }