Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 1 | #include "libm.h" |
| 2 | |
| 3 | #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame^] | 4 | long double frexpl(long double x, int* e) { |
| 5 | return frexp(x, e); |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 6 | } |
| 7 | #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame^] | 8 | long double frexpl(long double x, int* e) { |
| 9 | union ldshape u = {x}; |
| 10 | int ee = u.i.se & 0x7fff; |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 11 | |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame^] | 12 | if (!ee) { |
| 13 | if (x) { |
| 14 | x = frexpl(x * 0x1p120, e); |
| 15 | *e -= 120; |
| 16 | } else |
| 17 | *e = 0; |
| 18 | return x; |
| 19 | } else if (ee == 0x7fff) { |
| 20 | return x; |
| 21 | } |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 22 | |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame^] | 23 | *e = ee - 0x3ffe; |
| 24 | u.i.se &= 0x8000; |
| 25 | u.i.se |= 0x3ffe; |
| 26 | return u.f; |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 27 | } |
| 28 | #endif |