blob: 56ece12e3c0de7b5415e6aa1332385ff200dd2ff [file] [log] [blame]
pub fn modff(x: f32) -> (f32, f32) {
let rv2: f32;
let mut u: u32 = x.to_bits();
let mask: u32;
let e = ((u >> 23 & 0xff) as i32) - 0x7f;
/* no fractional part */
if e >= 23 {
rv2 = x;
if e == 0x80 && (u << 9) != 0 {
/* nan */
return (x, rv2);
}
u &= 0x80000000;
return (f32::from_bits(u), rv2);
}
/* no integral part */
if e < 0 {
u &= 0x80000000;
rv2 = f32::from_bits(u);
return (x, rv2);
}
mask = 0x007fffff >> e;
if (u & mask) == 0 {
rv2 = x;
u &= 0x80000000;
return (f32::from_bits(u), rv2);
}
u &= !mask;
rv2 = f32::from_bits(u);
return (x - rv2, rv2);
}