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>
|
2015-07-01 Martin Sebor <msebor@redhat.com>
|
||||||
|
|
||||||
[BZ #18435]
|
[BZ #18435]
|
||||||
|
|
2
NEWS
2
NEWS
|
@ -25,7 +25,7 @@ Version 2.22
|
||||||
18496, 18497, 18498, 18502, 18507, 18512, 18513, 18519, 18520, 18522,
|
18496, 18497, 18498, 18502, 18507, 18512, 18513, 18519, 18520, 18522,
|
||||||
18527, 18528, 18529, 18530, 18532, 18533, 18534, 18536, 18539, 18540,
|
18527, 18528, 18529, 18530, 18532, 18533, 18534, 18536, 18539, 18540,
|
||||||
18542, 18544, 18545, 18546, 18547, 18549, 18553, 18558, 18569, 18583,
|
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
|
* Cache information can be queried via sysconf() function on s390 e.g. with
|
||||||
_SC_LEVEL1_ICACHE_SIZE as argument.
|
_SC_LEVEL1_ICACHE_SIZE as argument.
|
||||||
|
|
|
@ -137,9 +137,18 @@ __expm1l (long double x)
|
||||||
if (x < minarg)
|
if (x < minarg)
|
||||||
return (4.0/big - 1.0L);
|
return (4.0/big - 1.0L);
|
||||||
|
|
||||||
/* Avoid internal underflow when result does not underflow. */
|
/* Avoid internal underflow when result does not underflow, while
|
||||||
if (fabsl (x) < 0x1p-113L && fabsl (x) >= LDBL_MIN)
|
ensuring underflow (without returning a zero of the wrong sign)
|
||||||
return x;
|
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. */
|
/* Express x = ln 2 (k + remainder), remainder not exceeding 1/2. */
|
||||||
xx = C1 + C2; /* ln 2. */
|
xx = C1 + C2; /* ln 2. */
|
||||||
|
|
Loading…
Reference in New Issue