| #[cfg_attr(assert_no_panic, no_panic::no_panic)] | |
| 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); | |
| } |