Fix ldbl-128ibm hypotl internal underflows (bug 14869)
Joseph S. Myers
joseph@codesourcery.com
Thu Nov 22 02:20:00 GMT 2012
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
More information about the Libc-alpha
mailing list