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