This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] [BZ #14686, #15336] sysdeps/ieee754/dbl-64/e_remainder.c:__ieee754_remainder -- Fix standard compliance. Don't use hard-coded qNaN values.


Hi!

To fix these two bugs, basically have the dbl-64 code do what the flt-32
code does.

	[BZ #14686, #15336]
	* sysdeps/ieee754/dbl-64/urem.h (nNAN, NAN): Remove definitions.
	* sysdeps/ieee754/dbl-64/e_remainder.c (__ieee754_remainder):
	Instead, use input NaN values or generate a qNaN by arithmetic
	operation.  Also fix bugs to comply with the standard.
	* math/libm-test.inc (remainder_test): Add more tests.

diff --git NEWS NEWS
index 1697d4e..0b7cdf2 100644
--- NEWS
+++ NEWS
@@ -10,9 +10,10 @@ Version 2.18
 * The following bugs are resolved with this release:
 
   10357, 11120, 11561, 12723, 13550, 13889, 13951, 14142, 14176, 14200,
-  14317, 14327, 14496, 14812, 14920, 14964, 14981, 14982, 14985, 14994,
-  14996, 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062, 15078,
-  15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15307, 15335.
+  14317, 14327, 14496, 14686, 14812, 14920, 14964, 14981, 14982, 14985,
+  14994, 14996, 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062,
+  15078, 15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15307,
+  15335, 15336.
 
 * Add support for calling C++11 thread_local object destructors on thread
   and program exit.  This needs compiler support for offloading C++11
diff --git math/libm-test.inc math/libm-test.inc
index 1d3ba48..c88d4ee 100644
--- math/libm-test.inc
+++ math/libm-test.inc
@@ -10500,12 +10500,30 @@ remainder_test (void)
   TEST_ff_f (remainder, 1, minus_zero, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(1, -0) = EDOM ", errno, EDOM, 0, 0, 0);
   errno = 0;
+  TEST_ff_f (remainder, plus_infty, minus_zero, qnan_value, INVALID_EXCEPTION);
+  check_int ("errno for remainder(INF, -0) = EDOM ", errno, EDOM, 0, 0, 0);
+  errno = 0;
+  TEST_ff_f (remainder, plus_infty, 0, qnan_value, INVALID_EXCEPTION);
+  check_int ("errno for remainder(INF, 0) = EDOM ", errno, EDOM, 0, 0, 0);
+  errno = 0;
   TEST_ff_f (remainder, plus_infty, 1, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(INF, 1) = EDOM ", errno, EDOM, 0, 0, 0);
   errno = 0;
+  TEST_ff_f (remainder, plus_infty, 2, qnan_value, INVALID_EXCEPTION);
+  check_int ("errno for remainder(INF, 2) = EDOM ", errno, EDOM, 0, 0, 0);
+  errno = 0;
+  TEST_ff_f (remainder, minus_infty, minus_zero, qnan_value, INVALID_EXCEPTION);
+  check_int ("errno for remainder(-INF, -0) = EDOM ", errno, EDOM, 0, 0, 0);
+  errno = 0;
+  TEST_ff_f (remainder, minus_infty, 0, qnan_value, INVALID_EXCEPTION);
+  check_int ("errno for remainder(-INF, 0) = EDOM ", errno, EDOM, 0, 0, 0);
+  errno = 0;
   TEST_ff_f (remainder, minus_infty, 1, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(-INF, 1) = EDOM ", errno, EDOM, 0, 0, 0);
   errno = 0;
+  TEST_ff_f (remainder, minus_infty, 2, qnan_value, INVALID_EXCEPTION);
+  check_int ("errno for remainder(-INF, 2) = EDOM ", errno, EDOM, 0, 0, 0);
+  errno = 0;
   TEST_ff_f (remainder, qnan_value, qnan_value, qnan_value);
   check_int ("errno for remainder(qNAN, qNAN) unchanged", errno, 0, 0, 0, 0);
   errno = 0;
@@ -10515,6 +10533,13 @@ remainder_test (void)
   TEST_ff_f (remainder, qnan_value, 0, qnan_value);
   check_int ("errno for remainder(qNaN, 0) unchanged", errno, 0, 0, 0, 0);
 
+  errno = 0;
+  TEST_ff_f (remainder, 7.0, plus_infty, 7.0);
+  check_int ("errno for remainder(7.0, INF) unchanged", errno, 0, 0, 0, 0);
+  errno = 0;
+  TEST_ff_f (remainder, 7.0, minus_infty, 7.0);
+  check_int ("errno for remainder(7.0, -INF) unchanged", errno, 0, 0, 0, 0);
+
   TEST_ff_f (remainder, 1.625, 1.0, -0.375);
   TEST_ff_f (remainder, -1.625, 1.0, 0.375);
   TEST_ff_f (remainder, 1.625, -1.0, -0.375);
diff --git sysdeps/ieee754/dbl-64/e_remainder.c sysdeps/ieee754/dbl-64/e_remainder.c
index c4db931..39ca0c2 100644
--- sysdeps/ieee754/dbl-64/e_remainder.c
+++ sysdeps/ieee754/dbl-64/e_remainder.c
@@ -111,12 +111,14 @@ double __ieee754_remainder(double x, double y)
       else return (z>0)?z-y:z+y;
     }
     else { /* if x is too big */
-      if (kx == 0x7ff00000 && u.i[LOW_HALF] == 0 && y == 1.0)
-	return x / x;
-      if (kx>=0x7ff00000||(ky==0&&t.i[LOW_HALF]==0)||ky>0x7ff00000||
-	  (ky==0x7ff00000&&t.i[LOW_HALF]!=0))
-	return (u.i[HIGH_HALF]&0x80000000)?nNAN.x:NAN.x;
-      else return x;
+      if (ky==0 && t.i[LOW_HALF] == 0)		/* y = 0 */
+	return (x * y) / (x * y);
+      else if (kx >= 0x7ff00000			/* x not finite */
+	       || (ky>0x7ff00000		/* y is NaN */
+		   || (ky == 0x7ff00000 && t.i[LOW_HALF] != 0)))
+	return (x * y) / (x * y);
+      else
+	return x;
     }
    }
   }
diff --git sysdeps/ieee754/dbl-64/urem.h sysdeps/ieee754/dbl-64/urem.h
index c4daa5d..b576691 100644
--- sysdeps/ieee754/dbl-64/urem.h
+++ sysdeps/ieee754/dbl-64/urem.h
@@ -32,18 +32,14 @@ static const mynumber big = {{0x43380000, 0}},  /* 6755399441055744 */
                      t128 = {{0x47f00000, 0}},  /*  2^ 128          */
                     tm128 = {{0x37f00000, 0}},  /*  2^-128          */
                       ZERO = {{0, 0}},          /*  0.0             */
-                     nZERO = {{0x80000000, 0}}, /* -0.0             */
-                       NAN = {{0x7ff80000, 0}}, /*  NaN             */
-                      nNAN = {{0xfff80000, 0}}; /* -NaN             */
+                     nZERO = {{0x80000000, 0}}; /* -0.0             */
 #else
 #ifdef LITTLE_ENDI
 static const mynumber big = {{0, 0x43380000}},  /* 6755399441055744 */
                      t128 = {{0, 0x47f00000}},  /*  2^ 128          */
                     tm128 = {{0, 0x37f00000}},  /*  2^-128          */
                       ZERO = {{0, 0}},          /*  0.0             */
-                     nZERO = {{0, 0x80000000}}, /* -0.0             */
-                       NAN = {{0, 0x7ff80000}}, /*  NaN             */
-                      nNAN = {{0, 0xfff80000}}; /* -NaN             */
+                     nZERO = {{0, 0x80000000}}; /* -0.0             */
 #endif
 #endif
 

And another patch for actually testing the IEEE standards compliance;
again assuming
<http://news.gmane.org/find-root.php?message_id=%3C871uaqzheb.fsf%40schwinge.name%3E>
in place:

diff --git math/libm-test.inc math/libm-test.inc
index c88d4ee..d6d811c 100644
--- math/libm-test.inc
+++ math/libm-test.inc
@@ -10496,49 +10496,64 @@ remainder_test (void)
   errno = 0;
   TEST_ff_f (remainder, 1, 0, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(1, 0) = EDOM ", errno, EDOM, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, 1, 0, qnan_value, INVALID_EXCEPTION);
   errno = 0;
   TEST_ff_f (remainder, 1, minus_zero, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(1, -0) = EDOM ", errno, EDOM, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, 1, minus_zero, qnan_value, INVALID_EXCEPTION);
   errno = 0;
   TEST_ff_f (remainder, plus_infty, minus_zero, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(INF, -0) = EDOM ", errno, EDOM, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, plus_infty, minus_zero, qnan_value, INVALID_EXCEPTION);
   errno = 0;
   TEST_ff_f (remainder, plus_infty, 0, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(INF, 0) = EDOM ", errno, EDOM, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, plus_infty, 0, qnan_value, INVALID_EXCEPTION);
   errno = 0;
   TEST_ff_f (remainder, plus_infty, 1, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(INF, 1) = EDOM ", errno, EDOM, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, plus_infty, 1, qnan_value, INVALID_EXCEPTION);
   errno = 0;
   TEST_ff_f (remainder, plus_infty, 2, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(INF, 2) = EDOM ", errno, EDOM, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, plus_infty, 2, qnan_value, INVALID_EXCEPTION);
   errno = 0;
   TEST_ff_f (remainder, minus_infty, minus_zero, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(-INF, -0) = EDOM ", errno, EDOM, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, minus_infty, minus_zero, qnan_value, INVALID_EXCEPTION);
   errno = 0;
   TEST_ff_f (remainder, minus_infty, 0, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(-INF, 0) = EDOM ", errno, EDOM, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, minus_infty, 0, qnan_value, INVALID_EXCEPTION);
   errno = 0;
   TEST_ff_f (remainder, minus_infty, 1, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(-INF, 1) = EDOM ", errno, EDOM, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, minus_infty, 1, qnan_value, INVALID_EXCEPTION);
   errno = 0;
   TEST_ff_f (remainder, minus_infty, 2, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(-INF, 2) = EDOM ", errno, EDOM, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, minus_infty, 2, qnan_value, INVALID_EXCEPTION);
   errno = 0;
   TEST_ff_f (remainder, qnan_value, qnan_value, qnan_value);
   check_int ("errno for remainder(qNAN, qNAN) unchanged", errno, 0, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, qnan_value, qnan_value, qnan_value);
   errno = 0;
   TEST_ff_f (remainder, 0, qnan_value, qnan_value);
   check_int ("errno for remainder(0, qNAN) unchanged", errno, 0, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, 0, qnan_value, qnan_value);
   errno = 0;
   TEST_ff_f (remainder, qnan_value, 0, qnan_value);
   check_int ("errno for remainder(qNaN, 0) unchanged", errno, 0, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, qnan_value, 0, qnan_value);
 
   errno = 0;
   TEST_ff_f (remainder, 7.0, plus_infty, 7.0);
   check_int ("errno for remainder(7.0, INF) unchanged", errno, 0, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, 7.0, plus_infty, 7.0);
   errno = 0;
   TEST_ff_f (remainder, 7.0, minus_infty, 7.0);
   check_int ("errno for remainder(7.0, -INF) unchanged", errno, 0, 0, 0, 0);
+  TEST_ff_f_IEEE (remainder, 7.0, minus_infty, 7.0);
 
   TEST_ff_f (remainder, 1.625, 1.0, -0.375);
   TEST_ff_f (remainder, -1.625, 1.0, 0.375);


GrÃÃe,
 Thomas

Attachment: pgpcTgv1seZUl.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]