2013-04-05 Thomas Schwinge <thomas@codesourcery.com>
+ [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.
+
[BZ #15335, #15342]
* sysdeps/ieee754/dbl-64/upow.h (NaNQ): Remove definitions.
* sysdeps/ieee754/dbl-64/e_pow.c (__ieee754_pow): Instead, use
* The following bugs are resolved with this release:
10357, 11120, 11561, 12723, 13550, 13889, 13951, 14142, 14176, 14200,
- 14317, 14327, 14478, 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, 15305,
- 15307, 15327, 15330, 15335, 15337, 15342.
+ 14317, 14327, 14478, 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,
+ 15305, 15307, 15327, 15330, 15335, 15336, 15337, 15342.
* CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
#15078).
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;
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);
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;
}
}
}
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