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