1 #include "libm.h" 2 3 #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 scalbnl(long double x,int n)4long double scalbnl(long double x, int n) 5 { 6 return scalbn(x, n); 7 } 8 #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 scalbnl(long double x,int n)9long double scalbnl(long double x, int n) 10 { 11 union ldshape u; 12 13 if (n > 16383) { 14 x *= 0x1p16383L; 15 n -= 16383; 16 if (n > 16383) { 17 x *= 0x1p16383L; 18 n -= 16383; 19 if (n > 16383) 20 n = 16383; 21 } 22 } else if (n < -16382) { 23 x *= 0x1p-16382L * 0x1p113L; 24 n += 16382 - 113; 25 if (n < -16382) { 26 x *= 0x1p-16382L * 0x1p113L; 27 n += 16382 - 113; 28 if (n < -16382) 29 n = -16382; 30 } 31 } 32 u.f = 1.0; 33 u.i.se = 0x3fff + n; 34 return x * u.f; 35 } 36 #endif 37