Fix ldbl-128 expm1l (-min_subnorm) result sign (bug 18619).

In the ldbl-128 implementation of expm1l, when expm1l's result should
underflow to 0 (argument minus the least subnormal, in some rounding
modes), it can be a zero of the wrong sign.  This patch fixes this in
the same way previously used for the x86 / x86_64 versions.

Tested for mips64.

	[BZ #18619]
	* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Force underflow
	and return argument in case of subnormal argument.
This commit is contained in:
Joseph Myers 2015-07-01 22:27:49 +00:00
parent ed225df3ad
commit a04bb3306a
3 changed files with 19 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2015-07-01 Joseph Myers <joseph@codesourcery.com>
[BZ #18619]
* sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Force underflow
and return argument in case of subnormal argument.
2015-07-01 Martin Sebor <msebor@redhat.com>
[BZ #18435]

2
NEWS
View File

@ -25,7 +25,7 @@ Version 2.22
18496, 18497, 18498, 18502, 18507, 18512, 18513, 18519, 18520, 18522,
18527, 18528, 18529, 18530, 18532, 18533, 18534, 18536, 18539, 18540,
18542, 18544, 18545, 18546, 18547, 18549, 18553, 18558, 18569, 18583,
18585, 18586, 18593, 18594, 18602, 18612, 18613.
18585, 18586, 18593, 18594, 18602, 18612, 18613, 18619.
* Cache information can be queried via sysconf() function on s390 e.g. with
_SC_LEVEL1_ICACHE_SIZE as argument.

View File

@ -137,9 +137,18 @@ __expm1l (long double x)
if (x < minarg)
return (4.0/big - 1.0L);
/* Avoid internal underflow when result does not underflow. */
if (fabsl (x) < 0x1p-113L && fabsl (x) >= LDBL_MIN)
return x;
/* Avoid internal underflow when result does not underflow, while
ensuring underflow (without returning a zero of the wrong sign)
when the result does underflow. */
if (fabsl (x) < 0x1p-113L)
{
if (fabsl (x) < LDBL_MIN)
{
long double force_underflow = x * x;
math_force_eval (force_underflow);
}
return x;
}
/* Express x = ln 2 (k + remainder), remainder not exceeding 1/2. */
xx = C1 + C2; /* ln 2. */