Browse Source

math: fix nextafter and nexttoward on maxdbl and maxflt input

old code (return x+x;) returns correct value and raises correct
flags only if the result is stored as double (or float)
Szabolcs Nagy 12 years ago
parent
commit
662ed20065
4 changed files with 4 additions and 4 deletions
  1. 1 1
      src/math/nextafter.c
  2. 1 1
      src/math/nextafterf.c
  3. 1 1
      src/math/nexttoward.c
  4. 1 1
      src/math/nexttowardf.c

+ 1 - 1
src/math/nextafter.c

@@ -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)
-		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);

+ 1 - 1
src/math/nextafterf.c

@@ -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)
-		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);

+ 1 - 1
src/math/nexttoward.c

@@ -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)
-		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);

+ 1 - 1
src/math/nexttowardf.c

@@ -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)
-		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);