Fix ldbl-128ibm coshl spurious overflows (bug 16407).

This patch fixes bug 16407, spurious overflows from ldbl-128ibm coshl.
The implementation assumed that a high part (reinterpreted as an
integer) of the absolute value of the argument of 0x408633ce8fb9f87dLL
or more meant overflow, but the actual threshold has high part
0x408633ce8fb9f87eLL (and a negative low part).  The patch adjusts the
threshold accordingly.

sinhl probably has the same issue, but I didn't get that far in adding
tests of special cases (such as just below and above overflow) before
the freeze and during the freeze is not a suitable time to add them
(as they'd require ulps to be regenerated again), so I'm not changing
that function for now; when I add more tests of special cases, we'll
discover whether sinhl indeed has this problem.

Tested powerpc32.

	* sysdeps/ieee754/ldbl-128ibm/e_coshl.c (__ieee754_coshl):
	Increase overflow threshold.
This commit is contained in:
Joseph Myers 2014-01-07 22:00:04 +00:00
parent 196f456b84
commit b821f414e4
3 changed files with 8 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2014-01-07 Joseph Myers <joseph@codesourcery.com>
[BZ #16407]
* sysdeps/ieee754/ldbl-128ibm/e_coshl.c (__ieee754_coshl):
Increase overflow threshold.
2014-01-07 Ondřej Bílka <neleai@seznam.cz>
[BZ #14286]

2
NEWS
View File

@ -24,7 +24,7 @@ Version 2.19
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, 16386, 16387, 16390, 16400.
16384, 16385, 16386, 16387, 16390, 16400, 16407.
* Slovenian translations for glibc messages have been contributed by the
Translation Project's Slovenian team of translators.

View File

@ -69,7 +69,7 @@ __ieee754_coshl (long double x)
if (ix < 0x40862e42fefa39efLL) return half*__ieee754_expl(fabsl(x));
/* |x| in [log(maxdouble), overflowthresold] */
if (ix < 0x408633ce8fb9f87dLL) {
if (ix < 0x408633ce8fb9f87fLL) {
w = __ieee754_expl(half*fabsl(x));
t = half*w;
return t*w;