pub fn modf(x: f64) -> (f64, f64) { | |
let rv2: f64; | |
let mut u = x.to_bits(); | |
let mask: u64; | |
let e = ((u >> 52 & 0x7ff) as i32) - 0x3ff; | |
/* no fractional part */ | |
if e >= 52 { | |
rv2 = x; | |
if e == 0x400 && (u << 12) != 0 { | |
/* nan */ | |
return (x, rv2); | |
} | |
u &= 1 << 63; | |
return (f64::from_bits(u), rv2); | |
} | |
/* no integral part*/ | |
if e < 0 { | |
u &= 1 << 63; | |
rv2 = f64::from_bits(u); | |
return (x, rv2); | |
} | |
mask = ((!0) >> 12) >> e; | |
if (u & mask) == 0 { | |
rv2 = x; | |
u &= 1 << 63; | |
return (f64::from_bits(u), rv2); | |
} | |
u &= !mask; | |
rv2 = f64::from_bits(u); | |
return (x - rv2, rv2); | |
} |