const_soft_float/soft_f64/helpers/
scalbn.rs

1use crate::soft_f64::SoftF64;
2
3pub(crate) const fn scalbn(x: SoftF64, mut n: i32) -> SoftF64 {
4    let x1p1023 = SoftF64::from_bits(0x7fe0000000000000); // 0x1p1023 === 2 ^ 1023
5    let x1p53 = SoftF64::from_bits(0x4340000000000000); // 0x1p53 === 2 ^ 53
6    let x1p_1022 = SoftF64::from_bits(0x0010000000000000); // 0x1p-1022 === 2 ^ (-1022)
7
8    let mut y = x;
9
10    if n > 1023 {
11        y = y.mul(x1p1023);
12        n -= 1023;
13        if n > 1023 {
14            y = y.mul(x1p1023);
15            n -= 1023;
16            if n > 1023 {
17                n = 1023;
18            }
19        }
20    } else if n < -1022 {
21        /* make sure final n < -53 to avoid double
22        rounding in the subnormal range */
23        y = y.mul(x1p_1022.mul(x1p53));
24        n += 1022 - 53;
25        if n < -1022 {
26            y = y.mul(x1p_1022.mul(x1p53));
27            n += 1022 - 53;
28            if n < -1022 {
29                n = -1022;
30            }
31        }
32    }
33    y.mul(SoftF64::from_bits(((0x3ff + n) as u64) << 52))
34}