1#include <math.h>
2#include <stdint.h>
3
4float scalbnf(float x, int n) {
5    union {
6        float f;
7        uint32_t i;
8    } u;
9    float_t y = x;
10
11    if (n > 127) {
12        y *= 0x1p127f;
13        n -= 127;
14        if (n > 127) {
15            y *= 0x1p127f;
16            n -= 127;
17            if (n > 127)
18                n = 127;
19        }
20    } else if (n < -126) {
21        y *= 0x1p-126f;
22        n += 126;
23        if (n < -126) {
24            y *= 0x1p-126f;
25            n += 126;
26            if (n < -126)
27                n = -126;
28        }
29    }
30    u.i = (uint32_t)(0x7f + n) << 23;
31    x = y * u.f;
32    return x;
33}
34