OLD | NEW |
1 #include <limits.h> | 1 #include <limits.h> |
2 #include "libm.h" | 2 #include "libm.h" |
3 | 3 |
4 #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 | 4 #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 |
5 int ilogbl(long double x) | 5 int ilogbl(long double x) { |
6 { | 6 return ilogb(x); |
7 » return ilogb(x); | |
8 } | 7 } |
9 #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 | 8 #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 |
10 int ilogbl(long double x) | 9 int ilogbl(long double x) { |
11 { | 10 PRAGMA_STDC_FENV_ACCESS_ON |
12 » PRAGMA_STDC_FENV_ACCESS_ON | 11 union ldshape u = {x}; |
13 » union ldshape u = {x}; | 12 uint64_t m = u.i.m; |
14 » uint64_t m = u.i.m; | 13 int e = u.i.se & 0x7fff; |
15 » int e = u.i.se & 0x7fff; | |
16 | 14 |
17 » if (!e) { | 15 if (!e) { |
18 » » if (m == 0) { | 16 if (m == 0) { |
19 » » » FORCE_EVAL(0/0.0f); | 17 FORCE_EVAL(0 / 0.0f); |
20 » » » return FP_ILOGB0; | 18 return FP_ILOGB0; |
21 » » } | 19 } |
22 » » /* subnormal x */ | 20 /* subnormal x */ |
23 » » for (e = -0x3fff+1; m>>63 == 0; e--, m<<=1); | 21 for (e = -0x3fff + 1; m >> 63 == 0; e--, m <<= 1) |
24 » » return e; | 22 ; |
25 » } | 23 return e; |
26 » if (e == 0x7fff) { | 24 } |
27 » » FORCE_EVAL(0/0.0f); | 25 if (e == 0x7fff) { |
28 » » return m<<1 ? FP_ILOGBNAN : INT_MAX; | 26 FORCE_EVAL(0 / 0.0f); |
29 » } | 27 return m << 1 ? FP_ILOGBNAN : INT_MAX; |
30 » return e - 0x3fff; | 28 } |
| 29 return e - 0x3fff; |
31 } | 30 } |
32 #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 | 31 #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 |
33 int ilogbl(long double x) | 32 int ilogbl(long double x) { |
34 { | 33 #pragma STDC FENV_ACCESS ON |
35 » #pragma STDC FENV_ACCESS ON | 34 union ldshape u = {x}; |
36 » union ldshape u = {x}; | 35 int e = u.i.se & 0x7fff; |
37 » int e = u.i.se & 0x7fff; | |
38 | 36 |
39 » if (!e) { | 37 if (!e) { |
40 » » if (x == 0) { | 38 if (x == 0) { |
41 » » » FORCE_EVAL(0/0.0f); | 39 FORCE_EVAL(0 / 0.0f); |
42 » » » return FP_ILOGB0; | 40 return FP_ILOGB0; |
43 » » } | 41 } |
44 » » /* subnormal x */ | 42 /* subnormal x */ |
45 » » x *= 0x1p120; | 43 x *= 0x1p120; |
46 » » return ilogbl(x) - 120; | 44 return ilogbl(x) - 120; |
47 » } | 45 } |
48 » if (e == 0x7fff) { | 46 if (e == 0x7fff) { |
49 » » FORCE_EVAL(0/0.0f); | 47 FORCE_EVAL(0 / 0.0f); |
50 » » u.i.se = 0; | 48 u.i.se = 0; |
51 » » return u.f ? FP_ILOGBNAN : INT_MAX; | 49 return u.f ? FP_ILOGBNAN : INT_MAX; |
52 » } | 50 } |
53 » return e - 0x3fff; | 51 return e - 0x3fff; |
54 } | 52 } |
55 #endif | 53 #endif |
OLD | NEW |