X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmath%2Fscalbnf.c;h=a5ad208b69929f24336fae40e6af37101c99a72f;hb=2fab90a71acd3698954c08b9062db67188443dd7;hp=e5c76db318e1925272605d577abc4b3a0b625e35;hpb=666271c105e4137bdfa195e217799d74143370d4;p=musl diff --git a/src/math/scalbnf.c b/src/math/scalbnf.c index e5c76db3..a5ad208b 100644 --- a/src/math/scalbnf.c +++ b/src/math/scalbnf.c @@ -1,35 +1,31 @@ -#include "libm.h" +#include +#include float scalbnf(float x, int n) { - /* make sure result is stored as double on overflow or underflow */ - volatile float z; - float scale; + union {float f; uint32_t i;} u; + float_t y = x; if (n > 127) { - x *= 0x1p127f; + y *= 0x1p127f; n -= 127; if (n > 127) { - x *= 0x1p127f; + y *= 0x1p127f; n -= 127; - if (n > 127) { - z = x * 0x1p127f; - return z; - } + if (n > 127) + n = 127; } } else if (n < -126) { - x *= 0x1p-126f; - n += 126; + y *= 0x1p-126f * 0x1p24f; + n += 126 - 24; if (n < -126) { - x *= 0x1p-126f; - n += 126; - if (n < -126) { - z = x * 0x1p-126f; - return z; - } + y *= 0x1p-126f * 0x1p24f; + n += 126 - 24; + if (n < -126) + n = -126; } } - SET_FLOAT_WORD(scale, (uint32_t)(0x7f+n)<<23); - z = x * scale; - return z; + u.i = (uint32_t)(0x7f+n)<<23; + x = y * u.f; + return x; }