]>
Commit | Line | Data |
---|---|---|
48663c56 | 1 | #[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)] |
8faf50e0 XL |
2 | pub fn scalbnf(mut x: f32, mut n: i32) -> f32 { |
3 | let x1p127 = f32::from_bits(0x7f000000); // 0x1p127f === 2 ^ 127 | |
4 | let x1p_126 = f32::from_bits(0x800000); // 0x1p-126f === 2 ^ -126 | |
5 | let x1p24 = f32::from_bits(0x4b800000); // 0x1p24f === 2 ^ 24 | |
6 | ||
7 | if n > 127 { | |
8 | x *= x1p127; | |
9 | n -= 127; | |
10 | if n > 127 { | |
11 | x *= x1p127; | |
12 | n -= 127; | |
13 | if n > 127 { | |
14 | n = 127; | |
15 | } | |
16 | } | |
17 | } else if n < -126 { | |
18 | x *= x1p_126 * x1p24; | |
19 | n += 126 - 24; | |
20 | if n < -126 { | |
21 | x *= x1p_126 * x1p24; | |
22 | n += 126 - 24; | |
23 | if n < -126 { | |
24 | n = -126; | |
25 | } | |
26 | } | |
27 | } | |
28 | x * f32::from_bits(((0x7f + n) as u32) << 23) | |
29 | } |