123456789101112131415161718192021222324252627282930313233 |
- #include "libm.h"
- double scalbn(double x, int n)
- {
- double scale;
- if (n > 1023) {
- x *= 0x1p1023;
- n -= 1023;
- if (n > 1023) {
- x *= 0x1p1023;
- n -= 1023;
- if (n > 1023) {
- STRICT_ASSIGN(double, x, x * 0x1p1023);
- return x;
- }
- }
- } else if (n < -1022) {
- x *= 0x1p-1022;
- n += 1022;
- if (n < -1022) {
- x *= 0x1p-1022;
- n += 1022;
- if (n < -1022) {
- STRICT_ASSIGN(double, x, x * 0x1p-1022);
- return x;
- }
- }
- }
- INSERT_WORDS(scale, (uint32_t)(0x3ff+n)<<20, 0);
- STRICT_ASSIGN(double, x, x * scale);
- return x;
- }
|