From: Joseph Myers Date: Thu, 2 Jan 2014 16:35:46 +0000 (+0000) Subject: Fix ldbl-128ibm logl inaccuracy (bug 16386). X-Git-Tag: glibc-2.19~170 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=819e5d50dd4d10dc359037eba74c70e74cb42739;p=thirdparty%2Fglibc.git Fix ldbl-128ibm logl inaccuracy (bug 16386). This patch fixes bug 16386, ldbl-128ibm logl inaccuracy (with consequent inaccuracy for lgammal) for arguments where the high double is subnormal, which showed up while attempting to regenerate ulps for powerpc-nofpu for 2.19. The problem here is logic failing to allow for subnormals when calculating the exponent of the argument. Tested for powerpc-nofpu. * sysdeps/ieee754/ldbl-128ibm/e_logl.c (__ieee754_logl): Adjust numbers with subnormal high part when calculating exponent. --- diff --git a/ChangeLog b/ChangeLog index 8200122be76..7f4d564d0ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2014-01-02 Joseph Myers + [BZ #16386] + * sysdeps/ieee754/ldbl-128ibm/e_logl.c (__ieee754_logl): Adjust + numbers with subnormal high part when calculating exponent. + [BZ #16385] * sysdeps/ieee754/ldbl-128ibm/s_asinhl.c (__asinhl): Use fabsl not fabs. diff --git a/NEWS b/NEWS index c96c0e3cd98..e0ea97aa0e1 100644 --- a/NEWS +++ b/NEWS @@ -23,7 +23,8 @@ Version 2.19 16038, 16041, 16055, 16071, 16072, 16074, 16077, 16078, 16103, 16112, 16143, 16144, 16146, 16150, 16151, 16153, 16167, 16172, 16195, 16214, 16245, 16271, 16274, 16283, 16289, 16293, 16314, 16316, 16330, 16337, - 16338, 16356, 16365, 16366, 16369, 16372, 16375, 16379, 16384, 16385. + 16338, 16356, 16365, 16366, 16369, 16372, 16375, 16379, 16384, 16385, + 16386. * Slovenian translations for glibc messages have been contributed by the Translation Project's Slovenian team of translators. diff --git a/sysdeps/ieee754/ldbl-128ibm/e_logl.c b/sysdeps/ieee754/ldbl-128ibm/e_logl.c index b7db2b9784f..58d6bc69726 100644 --- a/sysdeps/ieee754/ldbl-128ibm/e_logl.c +++ b/sysdeps/ieee754/ldbl-128ibm/e_logl.c @@ -229,6 +229,14 @@ __ieee754_logl(long double x) /* Extract exponent and reduce domain to 0.703125 <= u < 1.40625 */ unsigned int w0; e = (int) (m >> 20) - (int) 0x3fe; + if (e == -1022) + { + x *= 0x1p106L; + xhi = ldbl_high (x); + EXTRACT_WORDS (hx, lx, xhi); + m = hx; + e = (int) (m >> 20) - (int) 0x3fe - 106; + } m &= 0xfffff; w0 = m | 0x3fe00000; m |= 0x100000;