Fix ldbl-96 hypotl of subnormals (bug 15529).

This commit is contained in:
Joseph Myers 2013-05-24 20:52:55 +00:00
parent dd4259b9f7
commit 0323d08657
4 changed files with 21 additions and 2 deletions

View File

@ -1,5 +1,10 @@
2013-05-24 Joseph Myers <joseph@codesourcery.com>
[BZ #15529]
* sysdeps/ieee754/ldbl-96/e_hypotl.c (__ieee754_hypotl): Set high
bit of mantissa of 2^16382.
* math/libm-test.inc (hypot_test_data): Add more tests.
* math/libm-test.inc: Add drem and pow10 to list of tested
functions.
(pow10_test): New function.

3
NEWS
View File

@ -18,7 +18,8 @@ Version 2.18
15287, 15304, 15305, 15307, 15309, 15327, 15330, 15335, 15336, 15337,
15339, 15342, 15346, 15359, 15361, 15366, 15380, 15381, 15394, 15395,
15405, 15406, 15409, 15416, 15418, 15419, 15423, 15424, 15426, 15429,
15441, 15442, 15448, 15480, 15485, 15488, 15490, 15493, 15497, 15506.
15441, 15442, 15448, 15480, 15485, 15488, 15490, 15493, 15497, 15506,
15529.
* CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
#15078).

View File

@ -9386,6 +9386,19 @@ static const struct test_ff_f_data hypot_test_data[] =
#if defined TEST_LDOUBLE && LDBL_MAX_EXP >= 16384 && !defined TEST_INLINE
TEST_ff_f (hypot, 0x3p16381L, 0x4p16381L, 0x5p16381L),
#endif
TEST_ff_f (hypot, 0x1p-149L, 0x1p-149L, 1.9817352931807469938024533350782879785095e-45L, UNDERFLOW_EXCEPTION_FLOAT),
#ifndef TEST_FLOAT
TEST_ff_f (hypot, 0x1p-1074L, 0x1p-1074L, 6.9871433705131320800651344656990806305791e-324L, UNDERFLOW_EXCEPTION_DOUBLE),
#endif
#if defined TEST_LDOUBLE && LDBL_MIN_EXP <= -16381 && !defined TEST_INLINE
TEST_ff_f (hypot, 0x1p-16445L, 0x1p-16445L, 5.1550906155442528702558159159596215039925e-4951L, UNDERFLOW_EXCEPTION),
# if LDBL_MANT_DIG >= 113
TEST_ff_f (hypot, 0x1p-16494L, 0x1p-16494L, 9.1572804726500807075521065242888978445857e-4966L, UNDERFLOW_EXCEPTION),
# endif
#endif
};

View File

@ -85,7 +85,7 @@ long double __ieee754_hypotl(long double x, long double y)
u_int32_t high,low;
GET_LDOUBLE_WORDS(exp,high,low,b);
if((high|low)==0) return a;
SET_LDOUBLE_WORDS(t1, 0x7ffd, 0, 0); /* t1=2^16382 */
SET_LDOUBLE_WORDS(t1, 0x7ffd, 0x80000000, 0); /* t1=2^16382 */
b *= t1;
a *= t1;
k -= 16382;