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