| 1 | #[cfg_attr (all(test, assert_no_panic), no_panic::no_panic)] |
| 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 | } |
| 30 | |