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.
This commit is contained in:
Joseph Myers 2014-01-02 16:35:46 +00:00
parent 90b6a1e55f
commit 819e5d50dd
3 changed files with 14 additions and 1 deletions

View File

@ -1,5 +1,9 @@
2014-01-02 Joseph Myers <joseph@codesourcery.com> 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] [BZ #16385]
* sysdeps/ieee754/ldbl-128ibm/s_asinhl.c (__asinhl): Use fabsl not * sysdeps/ieee754/ldbl-128ibm/s_asinhl.c (__asinhl): Use fabsl not
fabs. fabs.

3
NEWS
View File

@ -23,7 +23,8 @@ Version 2.19
16038, 16041, 16055, 16071, 16072, 16074, 16077, 16078, 16103, 16112, 16038, 16041, 16055, 16071, 16072, 16074, 16077, 16078, 16103, 16112,
16143, 16144, 16146, 16150, 16151, 16153, 16167, 16172, 16195, 16214, 16143, 16144, 16146, 16150, 16151, 16153, 16167, 16172, 16195, 16214,
16245, 16271, 16274, 16283, 16289, 16293, 16314, 16316, 16330, 16337, 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 * Slovenian translations for glibc messages have been contributed by the
Translation Project's Slovenian team of translators. Translation Project's Slovenian team of translators.

View File

@ -229,6 +229,14 @@ __ieee754_logl(long double x)
/* Extract exponent and reduce domain to 0.703125 <= u < 1.40625 */ /* Extract exponent and reduce domain to 0.703125 <= u < 1.40625 */
unsigned int w0; unsigned int w0;
e = (int) (m >> 20) - (int) 0x3fe; 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; m &= 0xfffff;
w0 = m | 0x3fe00000; w0 = m | 0x3fe00000;
m |= 0x100000; m |= 0x100000;