37 lines
679 B
C
37 lines
679 B
C
#include "libc/math/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
|