compiler_builtins/math/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    /* no fractional part */
9    if e >= 52 {
10        rv2 = x;
11        if e == 0x400 && (u << 12) != 0 {
12            /* nan */
13            return (x, rv2);
14        }
15        u &= 1 << 63;
16        return (f64::from_bits(u), rv2);
17    }
18
19    /* no integral part*/
20    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}