github.com/afumu/libc@v0.0.6/musl/src/math/ilogbf.c (about)

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