فهرست منبع

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 سال پیش
والد
کامیت
662ed20065
4فایلهای تغییر یافته به همراه4 افزوده شده و 4 حذف شده
  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);