math: raise invalid flag in ilogb*.c on +-0, +-inf and nan
[musl] / src / math / scalbn.c
1 #include "libm.h"
2
3 double scalbn(double x, int n)
4 {
5         double scale;
6
7         if (n > 1023) {
8                 x *= 0x1p1023;
9                 n -= 1023;
10                 if (n > 1023) {
11                         x *= 0x1p1023;
12                         n -= 1023;
13                         if (n > 1023)
14                                 return x * 0x1p1023;
15                 }
16         } else if (n < -1022) {
17                 x *= 0x1p-1022;
18                 n += 1022;
19                 if (n < -1022) {
20                         x *= 0x1p-1022;
21                         n += 1022;
22                         if (n < -1022)
23                                 return x * 0x1p-1022;
24                 }
25         }
26         INSERT_WORDS(scale, (uint32_t)(0x3ff+n)<<20, 0);
27         return x * scale;
28 }