fix wide printf forms ignoring width for %lc format specifier
[musl] / src / math / nextafterf.c
index b703487..75a09f7 100644 (file)
@@ -1,34 +1,30 @@
 #include "libm.h"
 
-#define SIGN 0x80000000
-
 float nextafterf(float x, float y)
 {
-       union fshape ux, uy;
+       union {float f; uint32_t i;} ux={x}, uy={y};
        uint32_t ax, ay, e;
 
        if (isnan(x) || isnan(y))
                return x + y;
-       ux.value = x;
-       uy.value = y;
-       if (ux.bits == uy.bits)
+       if (ux.i == uy.i)
                return y;
-       ax = ux.bits & ~SIGN;
-       ay = uy.bits & ~SIGN;
+       ax = ux.i & 0x7fffffff;
+       ay = uy.i & 0x7fffffff;
        if (ax == 0) {
                if (ay == 0)
                        return y;
-               ux.bits = (uy.bits & SIGN) | 1;
-       } else if (ax > ay || ((ux.bits ^ uy.bits) & SIGN))
-               ux.bits--;
+               ux.i = (uy.i & 0x80000000) | 1;
+       } else if (ax > ay || ((ux.i ^ uy.i) & 0x80000000))
+               ux.i--;
        else
-               ux.bits++;
-       e = ux.bits & 0x7f800000;
-       /* raise overflow if ux.value is infinite and x is finite */
+               ux.i++;
+       e = ux.i & 0x7f800000;
+       /* raise overflow if ux.f is infinite and x is finite */
        if (e == 0x7f800000)
-               return x + x;
-       /* raise underflow if ux.value is subnormal or zero */
+               FORCE_EVAL(x+x);
+       /* raise underflow if ux.f is subnormal or zero */
        if (e == 0)
-               FORCE_EVAL(x*x + ux.value*ux.value);
-       return ux.value;
+               FORCE_EVAL(x*x + ux.f*ux.f);
+       return ux.f;
 }