| #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 |