diff options
Diffstat (limited to 'modules/fdlibm/src/s_scalbnf.cpp')
-rw-r--r-- | modules/fdlibm/src/s_scalbnf.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/modules/fdlibm/src/s_scalbnf.cpp b/modules/fdlibm/src/s_scalbnf.cpp new file mode 100644 index 0000000000..68eca80d90 --- /dev/null +++ b/modules/fdlibm/src/s_scalbnf.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2005-2020 Rich Felker, et al. + * + * SPDX-License-Identifier: MIT + * + * Please see https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT + * for all contributors to musl. + */ +#include <stdint.h> + +#include "math_private.h" + +float scalbnf(float x, int n) +{ + union {float f; uint32_t i;} u; + float y = x; + + if (n > 127) { + y *= 0x1p127f; + n -= 127; + if (n > 127) { + y *= 0x1p127f; + n -= 127; + if (n > 127) + n = 127; + } + } else if (n < -126) { + y *= 0x1p-126f * 0x1p24f; + n += 126 - 24; + if (n < -126) { + y *= 0x1p-126f * 0x1p24f; + n += 126 - 24; + if (n < -126) + n = -126; + } + } + u.i = (uint32_t)(0x7f+n)<<23; + x = y * u.f; + return x; +} |