Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 1 | #include <math.h> |
Rich Felker | b69f695 | 2012-03-13 01:17:53 -0400 | [diff] [blame] | 2 | #include <stdint.h> |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 3 | |
4 | float frexpf(float x, int *e) | ||||
5 | { | ||||
6 | union { float f; uint32_t i; } y = { x }; | ||||
7 | int ee = y.i>>23 & 0xff; | ||||
8 | |||||
9 | if (!ee) { | ||||
10 | if (x) { | ||||
11 | x = frexpf(x*0x1p64, e); | ||||
12 | *e -= 64; | ||||
13 | } else *e = 0; | ||||
14 | return x; | ||||
15 | } else if (ee == 0xff) { | ||||
16 | return x; | ||||
17 | } | ||||
18 | |||||
19 | *e = ee - 0x7e; | ||||
20 | y.i &= 0x807ffffful; | ||||
21 | y.i |= 0x3f000000ul; | ||||
22 | return y.f; | ||||
23 | } |