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