X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmath%2Filogbf.c;h=e23ba209ec4cd1c7648ca903e6b3aa948c6dc053;hb=03919b26ed41c31876db41f7cee076ced4513fad;hp=272cbdac0ccf36dc2bb9d2ede7116853cad1748f;hpb=b69f695acedd4ce2798ef9ea28d834ceccc789bd;p=musl diff --git a/src/math/ilogbf.c b/src/math/ilogbf.c index 272cbdac..e23ba209 100644 --- a/src/math/ilogbf.c +++ b/src/math/ilogbf.c @@ -3,18 +3,24 @@ int ilogbf(float x) { - union fshape u = {x}; - int e = u.bits>>23 & 0xff; + #pragma STDC FENV_ACCESS ON + union {float f; uint32_t i;} u = {x}; + uint32_t i = u.i; + int e = i>>23 & 0xff; if (!e) { - u.bits <<= 9; - if (u.bits == 0) + i <<= 9; + if (i == 0) { + FORCE_EVAL(0/0.0f); return FP_ILOGB0; + } /* subnormal x */ - for (e = -0x7f; u.bits < (uint32_t)1<<31; e--, u.bits<<=1); + for (e = -0x7f; i>>31 == 0; e--, i<<=1); return e; } - if (e == 0xff) - return u.bits<<9 ? FP_ILOGBNAN : INT_MAX; + if (e == 0xff) { + FORCE_EVAL(0/0.0f); + return i<<9 ? FP_ILOGBNAN : INT_MAX; + } return e - 0x7f; }