/* * 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 #include #include "math_private.h" #include "fpmath.h" /* * scalbnl (long double x, int n) * scalbnl(x,n) returns x* 2**n computed by exponent * manipulation rather than by actually performing an * exponentiation or a multiplication. */ #if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 long double scalbnl(long double x, int n) { union IEEEl2bits u; if (n > 16383) { x *= 0x1p16383L; n -= 16383; if (n > 16383) { x *= 0x1p16383L; n -= 16383; if (n > 16383) n = 16383; } } else if (n < -16382) { x *= 0x1p-16382L * 0x1p113L; n += 16382 - 113; if (n < -16382) { x *= 0x1p-16382L * 0x1p113L; n += 16382 - 113; if (n < -16382) n = -16382; } } u.e = 1.0; u.xbits.expsign = 0x3fff + n; return x * u.e; } __strong_reference(scalbnl, ldexpl); #endif