2012-03-13 01:17:53 -04:00
|
|
|
#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)
|
|
|
|
{
|
2012-03-19 10:54:07 +01:00
|
|
|
union IEEEl2bits scale;
|
2012-03-13 01:17:53 -04:00
|
|
|
|
2012-03-19 10:54:07 +01:00
|
|
|
if (n > 16383) {
|
|
|
|
x *= 0x1p16383L;
|
|
|
|
n -= 16383;
|
|
|
|
if (n > 16383) {
|
|
|
|
x *= 0x1p16383L;
|
|
|
|
n -= 16383;
|
|
|
|
if (n > 16383)
|
|
|
|
return x * 0x1p16383L;
|
|
|
|
}
|
|
|
|
} else if (n < -16382) {
|
|
|
|
x *= 0x1p-16382L;
|
|
|
|
n += 16382;
|
|
|
|
if (n < -16382) {
|
|
|
|
x *= 0x1p-16382L;
|
|
|
|
n += 16382;
|
|
|
|
if (n < -16382)
|
|
|
|
return x * 0x1p-16382L;
|
|
|
|
}
|
2012-03-13 01:17:53 -04:00
|
|
|
}
|
2012-03-19 23:41:19 +01:00
|
|
|
scale.e = 1.0;
|
2012-03-19 10:54:07 +01:00
|
|
|
scale.bits.exp = 0x3fff + n;
|
|
|
|
return x * scale.e;
|
2012-03-13 01:17:53 -04:00
|
|
|
}
|
|
|
|
#endif
|