mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
Fix lgamma*, log10* and log2* results [BZ #21171]
lgamma(-x) should return +Inf and raise divide-by-zero. log10(+-0) and log2(+-0) should return -Inf and raise divide-by-zero. Tested on powerpc, powerpc64, powerpc64le and x86_64. [BZ #21171] * sysdeps/ieee754/dbl-64/e_lgamma_r.c (__ieee754_lgamma_r): Return +Inf and raise divide-by-zero when x is negative. * sysdeps/ieee754/flt-32/e_lgammaf_r.c (__ieee754_lgammaf_r): Likewise. * sysdeps/ieee754/ldbl-128/e_lgammal_r.c (__ieee754_lgammal_r): Likewise. * sysdeps/ieee754/dbl-64/e_log10.c (__ieee754_log10): Return -Inf and raise divide-by-zero when x = +-0. * sysdeps/ieee754/dbl-64/e_log2.c (__ieee754_log2): Likewise. * sysdeps/ieee754/flt-32/e_log10f.c (__ieee754_log10f): Likewise. * sysdeps/ieee754/flt-32/e_log2f.c (__ieee754_log2f): Likewise. * sysdeps/ieee754/ldbl-128/e_log10l.c (__ieee754_log10l): Likewise. * sysdeps/ieee754/ldbl-128/e_log2l.c (__ieee754_log2l): Likewise. * sysdeps/ieee754/ldbl-128ibm/e_log10l.c (__ieee754_log10l): Likewise. * sysdeps/ieee754/ldbl-128ibm/e_log2l.c (__ieee754_log2l): Likewise.
This commit is contained in:
parent
f0166c1643
commit
51b34a9c47
17
ChangeLog
17
ChangeLog
@ -1,3 +1,20 @@
|
||||
2017-02-17 Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
|
||||
|
||||
[BZ #21171]
|
||||
* sysdeps/ieee754/dbl-64/e_lgamma_r.c (__ieee754_lgamma_r): Return
|
||||
+Inf and raise divide-by-zero when x is negative.
|
||||
* sysdeps/ieee754/flt-32/e_lgammaf_r.c (__ieee754_lgammaf_r): Likewise.
|
||||
* sysdeps/ieee754/ldbl-128/e_lgammal_r.c (__ieee754_lgammal_r): Likewise.
|
||||
* sysdeps/ieee754/dbl-64/e_log10.c (__ieee754_log10): Return
|
||||
-Inf and raise divide-by-zero when x = +-0.
|
||||
* sysdeps/ieee754/dbl-64/e_log2.c (__ieee754_log2): Likewise.
|
||||
* sysdeps/ieee754/flt-32/e_log10f.c (__ieee754_log10f): Likewise.
|
||||
* sysdeps/ieee754/flt-32/e_log2f.c (__ieee754_log2f): Likewise.
|
||||
* sysdeps/ieee754/ldbl-128/e_log10l.c (__ieee754_log10l): Likewise.
|
||||
* sysdeps/ieee754/ldbl-128/e_log2l.c (__ieee754_log2l): Likewise.
|
||||
* sysdeps/ieee754/ldbl-128ibm/e_log10l.c (__ieee754_log10l): Likewise.
|
||||
* sysdeps/ieee754/ldbl-128ibm/e_log2l.c (__ieee754_log2l): Likewise.
|
||||
|
||||
2017-02-16 Zack Weinberg <zackw@panix.com>
|
||||
|
||||
* scripts/build-many-glibcs.py (bot_build_mail): If the
|
||||
|
@ -225,7 +225,7 @@ __ieee754_lgamma_r(double x, int *signgamp)
|
||||
if(hx<0) {
|
||||
if(__builtin_expect(ix>=0x43300000, 0))
|
||||
/* |x|>=2**52, must be -integer */
|
||||
return x/zero;
|
||||
return __fabs (x)/zero;
|
||||
if (x < -2.0 && x > -28.0)
|
||||
return __lgamma_neg (x, signgamp);
|
||||
t = sin_pi(x);
|
||||
|
@ -65,7 +65,7 @@ __ieee754_log10 (double x)
|
||||
if (hx < 0x00100000)
|
||||
{ /* x < 2**-1022 */
|
||||
if (__glibc_unlikely (((hx & 0x7fffffff) | lx) == 0))
|
||||
return -two54 / (x - x); /* log(+-0)=-inf */
|
||||
return -two54 / __fabs (x); /* log(+-0)=-inf */
|
||||
if (__glibc_unlikely (hx < 0))
|
||||
return (x - x) / (x - x); /* log(-#) = NaN */
|
||||
k -= 54;
|
||||
|
@ -83,7 +83,7 @@ __ieee754_log2 (double x)
|
||||
if (hx < 0x00100000)
|
||||
{ /* x < 2**-1022 */
|
||||
if (__glibc_unlikely (((hx & 0x7fffffff) | lx) == 0))
|
||||
return -two54 / (x - x); /* log(+-0)=-inf */
|
||||
return -two54 / __fabs (x); /* log(+-0)=-inf */
|
||||
if (__glibc_unlikely (hx < 0))
|
||||
return (x - x) / (x - x); /* log(-#) = NaN */
|
||||
k -= 54;
|
||||
|
@ -160,7 +160,7 @@ __ieee754_lgammaf_r(float x, int *signgamp)
|
||||
}
|
||||
if(hx<0) {
|
||||
if(ix>=0x4b000000) /* |x|>=2**23, must be -integer */
|
||||
return x/zero;
|
||||
return __fabsf (x)/zero;
|
||||
if (ix > 0x40000000 /* X < 2.0f. */
|
||||
&& ix < 0x41700000 /* X > -15.0f. */)
|
||||
return __lgamma_negf (x, signgamp);
|
||||
|
@ -34,7 +34,7 @@ __ieee754_log10f(float x)
|
||||
k=0;
|
||||
if (hx < 0x00800000) { /* x < 2**-126 */
|
||||
if (__builtin_expect((hx&0x7fffffff)==0, 0))
|
||||
return -two25/(x-x); /* log(+-0)=-inf */
|
||||
return -two25/__fabsf (x); /* log(+-0)=-inf */
|
||||
if (__builtin_expect(hx<0, 0))
|
||||
return (x-x)/(x-x); /* log(-#) = NaN */
|
||||
k -= 25; x *= two25; /* subnormal number, scale up x */
|
||||
|
@ -43,7 +43,7 @@ __ieee754_log2f(float x)
|
||||
k=0;
|
||||
if (ix < 0x00800000) { /* x < 2**-126 */
|
||||
if (__builtin_expect((ix&0x7fffffff)==0, 0))
|
||||
return -two25/(x-x); /* log(+-0)=-inf */
|
||||
return -two25/__fabsf (x); /* log(+-0)=-inf */
|
||||
if (__builtin_expect(ix<0, 0))
|
||||
return (x-x)/(x-x); /* log(-#) = NaN */
|
||||
k -= 25; x *= two25; /* subnormal number, scale up x */
|
||||
|
@ -782,7 +782,7 @@ __ieee754_lgammal_r (_Float128 x, int *signgamp)
|
||||
q = -x;
|
||||
p = __floorl (q);
|
||||
if (p == q)
|
||||
return (one / (p - p));
|
||||
return (one / __fabsl (p - p));
|
||||
_Float128 halfp = p * L(0.5);
|
||||
if (halfp == __floorl (halfp))
|
||||
*signgamp = -1;
|
||||
|
@ -187,7 +187,7 @@ __ieee754_log10l (_Float128 x)
|
||||
/* Test for domain */
|
||||
GET_LDOUBLE_WORDS64 (hx, lx, x);
|
||||
if (((hx & 0x7fffffffffffffffLL) | lx) == 0)
|
||||
return (-1 / (x - x));
|
||||
return (-1 / __fabsl (x)); /* log10l(+-0)=-inf */
|
||||
if (hx < 0)
|
||||
return (x - x) / (x - x);
|
||||
if (hx >= 0x7fff000000000000LL)
|
||||
|
@ -181,7 +181,7 @@ __ieee754_log2l (_Float128 x)
|
||||
/* Test for domain */
|
||||
GET_LDOUBLE_WORDS64 (hx, lx, x);
|
||||
if (((hx & 0x7fffffffffffffffLL) | lx) == 0)
|
||||
return (-1 / (x - x));
|
||||
return (-1 / __fabsl (x)); /* log2l(+-0)=-inf */
|
||||
if (hx < 0)
|
||||
return (x - x) / (x - x);
|
||||
if (hx >= 0x7fff000000000000LL)
|
||||
|
@ -189,7 +189,7 @@ __ieee754_log10l (long double x)
|
||||
xhi = ldbl_high (x);
|
||||
EXTRACT_WORDS64 (hx, xhi);
|
||||
if ((hx & 0x7fffffffffffffffLL) == 0)
|
||||
return (-1.0L / (x - x));
|
||||
return (-1.0L / __fabsl (x)); /* log10l(+-0)=-inf */
|
||||
if (hx < 0)
|
||||
return (x - x) / (x - x);
|
||||
if (hx >= 0x7ff0000000000000LL)
|
||||
|
@ -183,7 +183,7 @@ __ieee754_log2l (long double x)
|
||||
xhi = ldbl_high (x);
|
||||
EXTRACT_WORDS64 (hx, xhi);
|
||||
if ((hx & 0x7fffffffffffffffLL) == 0)
|
||||
return (-1.0L / (x - x));
|
||||
return (-1.0L / __fabsl (x)); /* log2l(+-0)=-inf */
|
||||
if (hx < 0)
|
||||
return (x - x) / (x - x);
|
||||
if (hx >= 0x7ff0000000000000LL)
|
||||
|
Loading…
Reference in New Issue
Block a user