libm/math/
modf.rs
1#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
2pub fn modf(x: f64) -> (f64, f64) {
3 let rv2: f64;
4 let mut u = x.to_bits();
5 let mask: u64;
6 let e = (((u >> 52) & 0x7ff) as i32) - 0x3ff;
7
8 if e >= 52 {
10 rv2 = x;
11 if e == 0x400 && (u << 12) != 0 {
12 return (x, rv2);
14 }
15 u &= 1 << 63;
16 return (f64::from_bits(u), rv2);
17 }
18
19 if e < 0 {
21 u &= 1 << 63;
22 rv2 = f64::from_bits(u);
23 return (x, rv2);
24 }
25
26 mask = ((!0) >> 12) >> e;
27 if (u & mask) == 0 {
28 rv2 = x;
29 u &= 1 << 63;
30 return (f64::from_bits(u), rv2);
31 }
32 u &= !mask;
33 rv2 = f64::from_bits(u);
34 return (x - rv2, rv2);
35}