diff options
author | Joseph Myers <joseph@codesourcery.com> | 2014-01-02 16:35:46 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2014-01-02 16:35:46 +0000 |
commit | 819e5d50dd4d10dc359037eba74c70e74cb42739 (patch) | |
tree | fe51e811c4c6bb9e91bf2ab3730d34aa8c03452c | |
parent | 90b6a1e55fdbb3e6a3132742c26eb19666ad9e33 (diff) | |
download | glibc-819e5d50dd4d10dc359037eba74c70e74cb42739.tar glibc-819e5d50dd4d10dc359037eba74c70e74cb42739.tar.gz glibc-819e5d50dd4d10dc359037eba74c70e74cb42739.tar.bz2 glibc-819e5d50dd4d10dc359037eba74c70e74cb42739.zip |
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.
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/e_logl.c | 8 |
3 files changed, 14 insertions, 1 deletions
@@ -1,5 +1,9 @@ 2014-01-02 Joseph Myers <joseph@codesourcery.com> + [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. @@ -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 b7db2b9784..58d6bc6972 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; |