Fix lgamma*, log10* and log2* results [BZ #21171]

Message ID 1487251844-30111-1-git-send-email-tuliom@linux.vnet.ibm.com
State Committed
Delegated to: Joseph Myers
Headers

Commit Message

Tulio Magno Quites Machado Filho Feb. 16, 2017, 1:30 p.m. UTC
  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.

2017-02-16  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.
---
 sysdeps/ieee754/dbl-64/e_lgamma_r.c    | 2 +-
 sysdeps/ieee754/dbl-64/e_log10.c       | 2 +-
 sysdeps/ieee754/dbl-64/e_log2.c        | 2 +-
 sysdeps/ieee754/flt-32/e_lgammaf_r.c   | 2 +-
 sysdeps/ieee754/flt-32/e_log10f.c      | 2 +-
 sysdeps/ieee754/flt-32/e_log2f.c       | 2 +-
 sysdeps/ieee754/ldbl-128/e_lgammal_r.c | 2 +-
 sysdeps/ieee754/ldbl-128/e_log10l.c    | 2 +-
 sysdeps/ieee754/ldbl-128/e_log2l.c     | 2 +-
 sysdeps/ieee754/ldbl-128ibm/e_log10l.c | 2 +-
 sysdeps/ieee754/ldbl-128ibm/e_log2l.c  | 2 +-
 11 files changed, 11 insertions(+), 11 deletions(-)
  

Comments

Joseph Myers Feb. 16, 2017, 4:36 p.m. UTC | #1
On Thu, 16 Feb 2017, Tulio Magno Quites Machado Filho wrote:

> 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.
> 
> 2017-02-16  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.

OK.
  

Patch

diff --git a/sysdeps/ieee754/dbl-64/e_lgamma_r.c b/sysdeps/ieee754/dbl-64/e_lgamma_r.c
index 15154c0..c337679 100644
--- a/sysdeps/ieee754/dbl-64/e_lgamma_r.c
+++ b/sysdeps/ieee754/dbl-64/e_lgamma_r.c
@@ -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);
diff --git a/sysdeps/ieee754/dbl-64/e_log10.c b/sysdeps/ieee754/dbl-64/e_log10.c
index df59d9d..bf40bca 100644
--- a/sysdeps/ieee754/dbl-64/e_log10.c
+++ b/sysdeps/ieee754/dbl-64/e_log10.c
@@ -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;
diff --git a/sysdeps/ieee754/dbl-64/e_log2.c b/sysdeps/ieee754/dbl-64/e_log2.c
index bc6a341..5af68d8 100644
--- a/sysdeps/ieee754/dbl-64/e_log2.c
+++ b/sysdeps/ieee754/dbl-64/e_log2.c
@@ -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;
diff --git a/sysdeps/ieee754/flt-32/e_lgammaf_r.c b/sysdeps/ieee754/flt-32/e_lgammaf_r.c
index 4d8a66b..1bd2122 100644
--- a/sysdeps/ieee754/flt-32/e_lgammaf_r.c
+++ b/sysdeps/ieee754/flt-32/e_lgammaf_r.c
@@ -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);
diff --git a/sysdeps/ieee754/flt-32/e_log10f.c b/sysdeps/ieee754/flt-32/e_log10f.c
index 2cd01b4..aa21bbc 100644
--- a/sysdeps/ieee754/flt-32/e_log10f.c
+++ b/sysdeps/ieee754/flt-32/e_log10f.c
@@ -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 */
diff --git a/sysdeps/ieee754/flt-32/e_log2f.c b/sysdeps/ieee754/flt-32/e_log2f.c
index 857d13f..782d901 100644
--- a/sysdeps/ieee754/flt-32/e_log2f.c
+++ b/sysdeps/ieee754/flt-32/e_log2f.c
@@ -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 */
diff --git a/sysdeps/ieee754/ldbl-128/e_lgammal_r.c b/sysdeps/ieee754/ldbl-128/e_lgammal_r.c
index 6f55b4d..bef2601 100644
--- a/sysdeps/ieee754/ldbl-128/e_lgammal_r.c
+++ b/sysdeps/ieee754/ldbl-128/e_lgammal_r.c
@@ -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;
diff --git a/sysdeps/ieee754/ldbl-128/e_log10l.c b/sysdeps/ieee754/ldbl-128/e_log10l.c
index f73cd34..c992f6e 100644
--- a/sysdeps/ieee754/ldbl-128/e_log10l.c
+++ b/sysdeps/ieee754/ldbl-128/e_log10l.c
@@ -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)
diff --git a/sysdeps/ieee754/ldbl-128/e_log2l.c b/sysdeps/ieee754/ldbl-128/e_log2l.c
index 26a8d7e..cf4a380 100644
--- a/sysdeps/ieee754/ldbl-128/e_log2l.c
+++ b/sysdeps/ieee754/ldbl-128/e_log2l.c
@@ -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)
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_log10l.c b/sysdeps/ieee754/ldbl-128ibm/e_log10l.c
index 7477791..1fbfa48 100644
--- a/sysdeps/ieee754/ldbl-128ibm/e_log10l.c
+++ b/sysdeps/ieee754/ldbl-128ibm/e_log10l.c
@@ -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)
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_log2l.c b/sysdeps/ieee754/ldbl-128ibm/e_log2l.c
index e39eaba..c820dac 100644
--- a/sysdeps/ieee754/ldbl-128ibm/e_log2l.c
+++ b/sysdeps/ieee754/ldbl-128ibm/e_log2l.c
@@ -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)