const_soft_float/soft_f64/
trunc.rs

1use super::SoftF64;
2
3pub(crate) const fn trunc(x: SoftF64) -> SoftF64 {
4    let mut i: u64 = x.to_bits();
5    let mut e: i64 = (i >> 52 & 0x7ff) as i64 - 0x3ff + 12;
6
7    if e >= 52 + 12 {
8        return x;
9    }
10    if e < 12 {
11        e = 1;
12    }
13    let m = -1i64 as u64 >> e;
14    if (i & m) == 0 {
15        return x;
16    }
17    i &= !m;
18    SoftF64::from_bits(i)
19}
20
21#[cfg(test)]
22mod tests {
23    use crate::soft_f64::SoftF64;
24
25    #[test]
26    fn sanity_check() {
27        assert_eq!(super::trunc(SoftF64(1.1)).0, 1.0);
28    }
29}