mirror of git://sourceware.org/git/glibc.git
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:
parent
ed225df3ad
commit
a04bb3306a
|
@ -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
2
NEWS
|
@ -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.
|
||||
|
|
|
@ -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. */
|
||||
|
|
Loading…
Reference in New Issue