42a2b2943e32bc9a0700f4d789bfda84d41547d0
[musl] / src / math / scalbn.c
1 #include "libm.h"
2
3 double scalbn(double x, int n)
4 {
5         /* make sure result is stored as double on overflow or underflow */
6         volatile double z;
7         double scale;
8
9         if (n > 1023) {
10                 x *= 0x1p1023;
11                 n -= 1023;
12                 if (n > 1023) {
13                         x *= 0x1p1023;
14                         n -= 1023;
15                         if (n > 1023) {
16                                 z = x * 0x1p1023;
17                                 return z;
18                         }
19                 }
20         } else if (n < -1022) {
21                 x *= 0x1p-1022;
22                 n += 1022;
23                 if (n < -1022) {
24                         x *= 0x1p-1022;
25                         n += 1022;
26                         if (n < -1022) {
27                                 z = x * 0x1p-1022;
28                                 return z;
29                         }
30                 }
31         }
32         INSERT_WORDS(scale, (uint32_t)(0x3ff+n)<<20, 0);
33         z = x * scale;
34         return z;
35 }