about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2012-11-22 14:58:41 +0000
committerJoseph Myers <joseph@codesourcery.com>2012-11-22 14:58:41 +0000
commit1468ded38eb043991b3b0198ab55cacffb46ec04 (patch)
tree7ed374414c31cb98f23d12e93c118287bb81f300
parent8e27e3cc453849158e069dbed0eea7b8113ab8ff (diff)
downloadglibc-1468ded38eb043991b3b0198ab55cacffb46ec04.tar.gz
glibc-1468ded38eb043991b3b0198ab55cacffb46ec04.tar.xz
glibc-1468ded38eb043991b3b0198ab55cacffb46ec04.zip
Fix ldbl-128ibm hypotl internal underflows (bug 14869).
-rw-r--r--ChangeLog5
-rw-r--r--NEWS2
-rw-r--r--math/libm-test.inc3
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/e_hypotl.c2
4 files changed, 10 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 69dd8fe2d8..34e93e53c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2012-11-22  Joseph Myers  <joseph@codesourcery.com>
 
+	[BZ #14869]
+	* sysdeps/ieee754/ldbl-128ibm/e_hypotl.c (__ieee754_hypotl): Scale
+	up arguments below 2**-450, not just those below 2**-500.
+	* math/libm-test.inc (hypot_test): Add another test.
+
 	[BZ #14868]
 	* sysdeps/ieee754/ldbl-128ibm/e_hypotl.c (__ieee754_hypotl):
 	Return a+b for ratio over 2**120, not 2**60.
diff --git a/NEWS b/NEWS
index 94e1260137..51de010ebb 100644
--- a/NEWS
+++ b/NEWS
@@ -21,7 +21,7 @@ Version 2.17
   14638, 14645, 14648, 14652, 14660, 14661, 14669, 14672, 14683, 14694,
   14716, 14719, 14743, 14767, 14783, 14784, 14785, 14793, 14796, 14797,
   14801, 14805, 14807, 14809, 14811, 14815, 14821, 14822, 14824, 14828,
-  14831, 14835, 14838, 14856, 14863, 14865, 14866, 14868.
+  14831, 14835, 14838, 14856, 14863, 14865, 14866, 14868, 14869.
 
 * Port to ARM AArch64 contributed by Linaro.
 
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 21f46469de..b96f1bf92e 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -5731,6 +5731,9 @@ hypot_test (void)
   TEST_ff_f (hypot, 0.75L, 1.25L, 1.45773797371132511771853821938639577L);
 
   TEST_ff_f (hypot, 1.0L, 0x1p-61L, 1.0L);
+#if defined TEST_LDOUBLE && LDBL_MANT_DIG >= 106
+  TEST_ff_f (hypot, 0x1.23456789abcdef0123456789ab8p-500L, 0x1.23456789abcdef0123456789ab8p-500L, 4.9155782399407039128612180934736799735113e-151L);
+#endif
 
 #if !(defined TEST_FLOAT && defined TEST_INLINE)
   TEST_ff_f (hypot, 0x3p125L, 0x4p125L, 0x5p125L);
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c b/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c
index ce21194cd5..768bd3b06c 100644
--- a/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/e_hypotl.c
@@ -83,7 +83,7 @@ __ieee754_hypotl(long double x, long double y)
 	   k += 600;
 	   kld = two600;
 	}
-	if(hb < 0x20b0000000000000LL) {	/* b < 2**-500 */
+	if(hb < 0x23d0000000000000LL) {	/* b < 2**-450 */
 	    if(hb <= 0x000fffffffffffffLL) {	/* subnormal b or 0 */
 		u_int64_t low;
 		GET_LDOUBLE_LSW64(low,b);