1#include "libm.h" 2#include <limits.h> 3 4int 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