math: fix nextafter and nexttoward on maxdbl and maxflt input
authorSzabolcs Nagy <nsz@port70.net>
Tue, 13 Nov 2012 09:12:07 +0000 (10:12 +0100)
committerSzabolcs Nagy <nsz@port70.net>
Tue, 13 Nov 2012 09:12:07 +0000 (10:12 +0100)
old code (return x+x;) returns correct value and raises correct
flags only if the result is stored as double (or float)

src/math/nextafter.c
src/math/nextafterf.c
src/math/nexttoward.c
src/math/nexttowardf.c

index a3b42c9..9ee8251 100644 (file)
@@ -27,7 +27,7 @@ double nextafter(double x, double y)
        e = ux.bits >> 52 & 0x7ff;
        /* raise overflow if ux.value is infinite and x is finite */
        if (e == 0x7ff)
        e = ux.bits >> 52 & 0x7ff;
        /* raise overflow if ux.value is infinite and x is finite */
        if (e == 0x7ff)
-               return x + x;
+               FORCE_EVAL(x+x);
        /* raise underflow if ux.value is subnormal or zero */
        if (e == 0)
                FORCE_EVAL(x*x + ux.value*ux.value);
        /* raise underflow if ux.value is subnormal or zero */
        if (e == 0)
                FORCE_EVAL(x*x + ux.value*ux.value);
index b703487..22b61dc 100644 (file)
@@ -26,7 +26,7 @@ float nextafterf(float x, float y)
        e = ux.bits & 0x7f800000;
        /* raise overflow if ux.value is infinite and x is finite */
        if (e == 0x7f800000)
        e = ux.bits & 0x7f800000;
        /* raise overflow if ux.value is infinite and x is finite */
        if (e == 0x7f800000)
-               return x + x;
+               FORCE_EVAL(x+x);
        /* raise underflow if ux.value is subnormal or zero */
        if (e == 0)
                FORCE_EVAL(x*x + ux.value*ux.value);
        /* raise underflow if ux.value is subnormal or zero */
        if (e == 0)
                FORCE_EVAL(x*x + ux.value*ux.value);
index 7355f2f..6f32eca 100644 (file)
@@ -36,7 +36,7 @@ double nexttoward(double x, long double y)
        e = ux.bits>>52 & 0x7ff;
        /* raise overflow if ux.value is infinite and x is finite */
        if (e == 0x7ff)
        e = ux.bits>>52 & 0x7ff;
        /* raise overflow if ux.value is infinite and x is finite */
        if (e == 0x7ff)
-               return x + x;
+               FORCE_EVAL(x+x);
        /* raise underflow if ux.value is subnormal or zero */
        if (e == 0)
                FORCE_EVAL(x*x + ux.value*ux.value);
        /* raise underflow if ux.value is subnormal or zero */
        if (e == 0)
                FORCE_EVAL(x*x + ux.value*ux.value);
index 8648be6..9a693b1 100644 (file)
@@ -28,7 +28,7 @@ float nexttowardf(float x, long double y)
        e = ux.bits & 0x7f800000;
        /* raise overflow if ux.value is infinite and x is finite */
        if (e == 0x7f800000)
        e = ux.bits & 0x7f800000;
        /* raise overflow if ux.value is infinite and x is finite */
        if (e == 0x7f800000)
-               return x + x;
+               FORCE_EVAL(x+x);
        /* raise underflow if ux.value is subnormal or zero */
        if (e == 0)
                FORCE_EVAL(x*x + ux.value*ux.value);
        /* raise underflow if ux.value is subnormal or zero */
        if (e == 0)
                FORCE_EVAL(x*x + ux.value*ux.value);