mirror of
https://github.com/fluencelabs/musl
synced 2025-06-01 17:11:53 +00:00
zero, one, two, half are replaced by const literals The policy was to use the f suffix for float consts (1.0f), but don't use suffix for long double consts (these consts can be exactly represented as double).
37 lines
682 B
C
37 lines
682 B
C
#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 IEEEl2bits scale;
|
|
|
|
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;
|
|
}
|
|
}
|
|
scale.e = 1.0;
|
|
scale.bits.exp = 0x3fff + n;
|
|
return x * scale.e;
|
|
}
|
|
#endif
|