#include "libm.h" | |
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 | |
long double scalbnl(long double x, int n) { | |
return scalbn(x, n); | |
} | |
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 | |
long double scalbnl(long double x, int n) { | |
union ldshape 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; | |
n += 16382; | |
if (n < -16382) { | |
x *= 0x1p-16382L; | |
n += 16382; | |
if (n < -16382) | |
n = -16382; | |
} | |
} | |
u.f = 1.0; | |
u.i.se = 0x3fff + n; | |
return x * u.f; | |
} | |
#endif |