OLD | NEW |
1 #include <limits.h> | 1 #include <limits.h> |
2 #include "libm.h" | 2 #include "libm.h" |
3 | 3 |
4 int ilogbf(float x) | 4 int ilogbf(float x) { |
5 { | 5 PRAGMA_STDC_FENV_ACCESS_ON |
6 » PRAGMA_STDC_FENV_ACCESS_ON | 6 union { |
7 » union {float f; uint32_t i;} u = {x}; | 7 float f; |
8 » uint32_t i = u.i; | 8 uint32_t i; |
9 » int e = i>>23 & 0xff; | 9 } u = {x}; |
| 10 uint32_t i = u.i; |
| 11 int e = i >> 23 & 0xff; |
10 | 12 |
11 » if (!e) { | 13 if (!e) { |
12 » » i <<= 9; | 14 i <<= 9; |
13 » » if (i == 0) { | 15 if (i == 0) { |
14 » » » FORCE_EVAL(0/0.0f); | 16 FORCE_EVAL(0 / 0.0f); |
15 » » » return FP_ILOGB0; | 17 return FP_ILOGB0; |
16 » » } | 18 } |
17 » » /* subnormal x */ | 19 /* subnormal x */ |
18 » » for (e = -0x7f; i>>31 == 0; e--, i<<=1); | 20 for (e = -0x7f; i >> 31 == 0; e--, i <<= 1) |
19 » » return e; | 21 ; |
20 » } | 22 return e; |
21 » if (e == 0xff) { | 23 } |
22 » » FORCE_EVAL(0/0.0f); | 24 if (e == 0xff) { |
23 » » return i<<9 ? FP_ILOGBNAN : INT_MAX; | 25 FORCE_EVAL(0 / 0.0f); |
24 » } | 26 return i << 9 ? FP_ILOGBNAN : INT_MAX; |
25 » return e - 0x7f; | 27 } |
| 28 return e - 0x7f; |
26 } | 29 } |
OLD | NEW |