1570af302Sopenharmony_ci#include "libm.h" 2570af302Sopenharmony_ci 3570af302Sopenharmony_ci#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 4570af302Sopenharmony_cilong double scalbnl(long double x, int n) 5570af302Sopenharmony_ci{ 6570af302Sopenharmony_ci return scalbn(x, n); 7570af302Sopenharmony_ci} 8570af302Sopenharmony_ci#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 9570af302Sopenharmony_cilong double scalbnl(long double x, int n) 10570af302Sopenharmony_ci{ 11570af302Sopenharmony_ci union ldshape u; 12570af302Sopenharmony_ci 13570af302Sopenharmony_ci if (n > 16383) { 14570af302Sopenharmony_ci x *= 0x1p16383L; 15570af302Sopenharmony_ci n -= 16383; 16570af302Sopenharmony_ci if (n > 16383) { 17570af302Sopenharmony_ci x *= 0x1p16383L; 18570af302Sopenharmony_ci n -= 16383; 19570af302Sopenharmony_ci if (n > 16383) 20570af302Sopenharmony_ci n = 16383; 21570af302Sopenharmony_ci } 22570af302Sopenharmony_ci } else if (n < -16382) { 23570af302Sopenharmony_ci x *= 0x1p-16382L * 0x1p113L; 24570af302Sopenharmony_ci n += 16382 - 113; 25570af302Sopenharmony_ci if (n < -16382) { 26570af302Sopenharmony_ci x *= 0x1p-16382L * 0x1p113L; 27570af302Sopenharmony_ci n += 16382 - 113; 28570af302Sopenharmony_ci if (n < -16382) 29570af302Sopenharmony_ci n = -16382; 30570af302Sopenharmony_ci } 31570af302Sopenharmony_ci } 32570af302Sopenharmony_ci u.f = 1.0; 33570af302Sopenharmony_ci u.i.se = 0x3fff + n; 34570af302Sopenharmony_ci return x * u.f; 35570af302Sopenharmony_ci} 36570af302Sopenharmony_ci#endif 37