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]

Fix ldbl-128ibm hypotl internal underflows (bug 14869)


Bug 14869 is inaccuracy and spurious underflows from ldbl128-ibm
hypotl for arguments above 2**-500, but not large enough to avoid
underflow when squaring (the 2**-500 value being unchanged from the
dbl-64 version).  This patch (relative to a tree with my fix for bug
14868 applied) fixes this by using 2**-450 instead as the threshold
for scaling up.

Tested that this fixes the large errors for the added test on powerpc.

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.

diff --git a/math/libm-test.inc b/math/libm-test.inc
index 67cb190..96e2569 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 ce21194..768bd3b 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);

-- 
Joseph S. Myers
joseph@codesourcery.com


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