X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmath%2Filogbf.c;h=e23ba209ec4cd1c7648ca903e6b3aa948c6dc053;hb=246f1c811448f37a44b41cd8df8d0ef9736d95f4;hp=42cd62e2dd9b37598c716b73825090fd74eb588a;hpb=be81f51030d90de8d5eb0b65dbdab3032d5cae23;p=musl diff --git a/src/math/ilogbf.c b/src/math/ilogbf.c index 42cd62e2..e23ba209 100644 --- a/src/math/ilogbf.c +++ b/src/math/ilogbf.c @@ -3,22 +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) { FORCE_EVAL(0/0.0f); - return u.bits<<9 ? FP_ILOGBNAN : INT_MAX; + return i<<9 ? FP_ILOGBNAN : INT_MAX; } return e - 0x7f; }