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