#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 * 0x1p113L; n += 16382 - 113; if (n < -16382) { x *= 0x1p-16382L * 0x1p113L; n += 16382 - 113; if (n < -16382) n = -16382; } } u.f = 1.0; u.i.se = 0x3fff + n; return x * u.f; } #endif