This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix tgamma errno setting on underflow (bug 6810)


This patch, relative to a tree with
<https://sourceware.org/ml/libc-alpha/2013-12/msg00183.html> applied,
fixes bug 6810, missing errno setting on tgamma underflow.  Since
there is no case for this in __kernel_standard and matherr handling is
only supposed to be for cases it's already supported for existing
programs, errno is set directly for this case in w_tgamma*.c.

Tested x86_64 and x86 and ulps updated accordingly.

(Diffs to auto-libm-test-out omitted below.)

2013-12-05  Joseph Myers  <joseph@codesourcery.com>

	[BZ #6810]
	* math/w_tgamma.c: Include <errno.h>.
	(__tgamma): Set errno on underflow to 0.
	* math/w_tgammaf.c: Include <errno.h>.
	(__tgammaf): Set errno on underflow to 0.
	* math/w_tgammal.c: Include <errno.h>.
	(__tgammal): Set errno on underflow to 0.
	* math/auto-libm-test-in: Do not allow missing errno on tgamma
	underflow.  Add more tgamma tests.
	* math/auto-libm-test-out: Regenerated.
	* sysdeps/i386/fpu/libm-test-ulps: Update.
	* sysdeps/x86_64/fpu/libm-test-ulps: Likewise.

diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
index c7148ce..cda7816 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -596,9 +596,8 @@ tgamma -0x27.ffffcp0
 tgamma -0x28.00004p0
 tgamma -0x28.ffffcp0
 tgamma -0x29.00004p0
-# Bug 6810: errno may not be set on underflow.
-tgamma -0x29.ffffcp0 missing-errno
-tgamma -0x2a.00004p0 missing-errno
+tgamma -0x29.ffffcp0
+tgamma -0x2a.00004p0
 tgamma 0x8.0000000000008p0
 tgamma 0x7.ffffffffffffcp0
 tgamma 0x7.0000000000004p0
@@ -641,23 +640,22 @@ tgamma -0x27.fffffffffffep0
 tgamma -0x28.000000000002p0
 tgamma -0x28.fffffffffffep0
 tgamma -0x29.000000000002p0
-# Bug 6810: errno may not be set on underflow.
-tgamma -0x29.fffffffffffep0 missing-errno
-tgamma -0x2a.000000000002p0 missing-errno
-tgamma -0x31.fffffffffffep0 missing-errno
-tgamma -0x32.000000000002p0 missing-errno
-tgamma -0x63.fffffffffffcp0 missing-errno
-tgamma -0x64.000000000004p0 missing-errno
-tgamma -0x95.fffffffffff8p0 missing-errno
-tgamma -0x96.000000000008p0 missing-errno
-tgamma -0xb4.fffffffffff8p0 missing-errno
-tgamma -0xb5.000000000008p0 missing-errno
-tgamma -0xb5.fffffffffff8p0 missing-errno
-tgamma -0xb6.000000000008p0 missing-errno
-tgamma -0xb6.fffffffffff8p0 missing-errno
-tgamma -0xb7.000000000008p0 missing-errno
-tgamma -0xb7.fffffffffff8p0 missing-errno
-tgamma -0xb8.000000000008p0 missing-errno
+tgamma -0x29.fffffffffffep0
+tgamma -0x2a.000000000002p0
+tgamma -0x31.fffffffffffep0
+tgamma -0x32.000000000002p0
+tgamma -0x63.fffffffffffcp0
+tgamma -0x64.000000000004p0
+tgamma -0x95.fffffffffff8p0
+tgamma -0x96.000000000008p0
+tgamma -0xb4.fffffffffff8p0
+tgamma -0xb5.000000000008p0
+tgamma -0xb5.fffffffffff8p0
+tgamma -0xb6.000000000008p0
+tgamma -0xb6.fffffffffff8p0
+tgamma -0xb7.000000000008p0
+tgamma -0xb7.fffffffffff8p0
+tgamma -0xb8.000000000008p0
 tgamma 0x8.00000000000000000000000004p0
 tgamma 0x7.fffffffffffffffffffffffffep0
 tgamma 0x7.00000000000000000000000002p0
@@ -700,31 +698,30 @@ tgamma -0x27.fffffffffffffffffffffffffp0
 tgamma -0x28.0000000000000000000000001p0
 tgamma -0x28.fffffffffffffffffffffffffp0
 tgamma -0x29.0000000000000000000000001p0
-# Bug 6810: errno may not be set on underflow.
-tgamma -0x29.fffffffffffffffffffffffffp0 missing-errno
-tgamma -0x2a.0000000000000000000000001p0 missing-errno
-tgamma -0x31.fffffffffffffffffffffffffp0 missing-errno
-tgamma -0x32.0000000000000000000000001p0 missing-errno
-tgamma -0x63.ffffffffffffffffffffffffep0 missing-errno
-tgamma -0x64.0000000000000000000000002p0 missing-errno
-tgamma -0x95.ffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x96.0000000000000000000000004p0 missing-errno
-tgamma -0xb4.ffffffffffffffffffffffffcp0 missing-errno
-tgamma -0xb5.0000000000000000000000004p0 missing-errno
-tgamma -0xb5.ffffffffffffffffffffffffcp0 missing-errno
-tgamma -0xb6.0000000000000000000000004p0 missing-errno
-tgamma -0xb6.ffffffffffffffffffffffffcp0 missing-errno
-tgamma -0xb7.0000000000000000000000004p0 missing-errno
-tgamma -0xb7.ffffffffffffffffffffffffcp0 missing-errno
-tgamma -0xb8.0000000000000000000000004p0 missing-errno
-tgamma -0xbb.ffffffffffffffffffffffffcp0 missing-errno
-tgamma -0xbc.0000000000000000000000004p0 missing-errno
-tgamma -0xbc.ffffffffffffffffffffffffcp0 missing-errno
-tgamma -0xbd.0000000000000000000000004p0 missing-errno
-tgamma -0xbd.ffffffffffffffffffffffffcp0 missing-errno
-tgamma -0xbe.0000000000000000000000004p0 missing-errno
-tgamma -0xbe.ffffffffffffffffffffffffcp0 missing-errno
-tgamma -0xbf.0000000000000000000000004p0 missing-errno
+tgamma -0x29.fffffffffffffffffffffffffp0
+tgamma -0x2a.0000000000000000000000001p0
+tgamma -0x31.fffffffffffffffffffffffffp0
+tgamma -0x32.0000000000000000000000001p0
+tgamma -0x63.ffffffffffffffffffffffffep0
+tgamma -0x64.0000000000000000000000002p0
+tgamma -0x95.ffffffffffffffffffffffffcp0
+tgamma -0x96.0000000000000000000000004p0
+tgamma -0xb4.ffffffffffffffffffffffffcp0
+tgamma -0xb5.0000000000000000000000004p0
+tgamma -0xb5.ffffffffffffffffffffffffcp0
+tgamma -0xb6.0000000000000000000000004p0
+tgamma -0xb6.ffffffffffffffffffffffffcp0
+tgamma -0xb7.0000000000000000000000004p0
+tgamma -0xb7.ffffffffffffffffffffffffcp0
+tgamma -0xb8.0000000000000000000000004p0
+tgamma -0xbb.ffffffffffffffffffffffffcp0
+tgamma -0xbc.0000000000000000000000004p0
+tgamma -0xbc.ffffffffffffffffffffffffcp0
+tgamma -0xbd.0000000000000000000000004p0
+tgamma -0xbd.ffffffffffffffffffffffffcp0
+tgamma -0xbe.0000000000000000000000004p0
+tgamma -0xbe.ffffffffffffffffffffffffcp0
+tgamma -0xbf.0000000000000000000000004p0
 tgamma 0x8.000000000000001p0
 tgamma 0x7.fffffffffffffff8p0
 tgamma 0x7.0000000000000008p0
@@ -767,53 +764,52 @@ tgamma -0x27.ffffffffffffffcp0
 tgamma -0x28.000000000000004p0
 tgamma -0x28.ffffffffffffffcp0
 tgamma -0x29.000000000000004p0
-# Bug 6810: errno may not be set on underflow.
-tgamma -0x29.ffffffffffffffcp0 missing-errno
-tgamma -0x2a.000000000000004p0 missing-errno
-tgamma -0x31.ffffffffffffffcp0 missing-errno
-tgamma -0x32.000000000000004p0 missing-errno
-tgamma -0x63.ffffffffffffff8p0 missing-errno
-tgamma -0x64.000000000000008p0 missing-errno
-tgamma -0x95.ffffffffffffffp0 missing-errno
-tgamma -0x96.00000000000001p0 missing-errno
-tgamma -0xb4.ffffffffffffffp0 missing-errno
-tgamma -0xb5.00000000000001p0 missing-errno
-tgamma -0xb5.ffffffffffffffp0 missing-errno
-tgamma -0xb6.00000000000001p0 missing-errno
-tgamma -0xb6.ffffffffffffffp0 missing-errno
-tgamma -0xb7.00000000000001p0 missing-errno
-tgamma -0xb7.ffffffffffffffp0 missing-errno
-tgamma -0xb8.00000000000001p0 missing-errno
-tgamma -0xbb.ffffffffffffffp0 missing-errno
-tgamma -0xbc.00000000000001p0 missing-errno
-tgamma -0xbc.ffffffffffffffp0 missing-errno
-tgamma -0xbd.00000000000001p0 missing-errno
-tgamma -0xbd.ffffffffffffffp0 missing-errno
-tgamma -0xbe.00000000000001p0 missing-errno
-tgamma -0xbe.ffffffffffffffp0 missing-errno
-tgamma -0xbf.00000000000001p0 missing-errno
-tgamma -0xf9.ffffffffffffffp0 missing-errno
-tgamma -0xfa.00000000000001p0 missing-errno
-tgamma -0x1f3.fffffffffffffep0 missing-errno
-tgamma -0x1f4.00000000000002p0 missing-errno
-tgamma -0x2ed.fffffffffffffcp0 missing-errno
-tgamma -0x2ee.00000000000004p0 missing-errno
-tgamma -0x3e7.fffffffffffffcp0 missing-errno
-tgamma -0x3e8.00000000000004p0 missing-errno
-tgamma -0x4e1.fffffffffffff8p0 missing-errno
-tgamma -0x4e2.00000000000008p0 missing-errno
-tgamma -0x5db.fffffffffffff8p0 missing-errno
-tgamma -0x5dc.00000000000008p0 missing-errno
-tgamma -0x6d5.fffffffffffff8p0 missing-errno
-tgamma -0x6d6.00000000000008p0 missing-errno
-tgamma -0x6e2.fffffffffffff8p0 missing-errno
-tgamma -0x6e3.00000000000008p0 missing-errno
-tgamma -0x6e3.fffffffffffff8p0 missing-errno
-tgamma -0x6e4.00000000000008p0 missing-errno
-tgamma -0x6e4.fffffffffffff8p0 missing-errno
-tgamma -0x6e5.00000000000008p0 missing-errno
-tgamma -0x6e5.fffffffffffff8p0 missing-errno
-tgamma -0x6e6.00000000000008p0 missing-errno
+tgamma -0x29.ffffffffffffffcp0
+tgamma -0x2a.000000000000004p0
+tgamma -0x31.ffffffffffffffcp0
+tgamma -0x32.000000000000004p0
+tgamma -0x63.ffffffffffffff8p0
+tgamma -0x64.000000000000008p0
+tgamma -0x95.ffffffffffffffp0
+tgamma -0x96.00000000000001p0
+tgamma -0xb4.ffffffffffffffp0
+tgamma -0xb5.00000000000001p0
+tgamma -0xb5.ffffffffffffffp0
+tgamma -0xb6.00000000000001p0
+tgamma -0xb6.ffffffffffffffp0
+tgamma -0xb7.00000000000001p0
+tgamma -0xb7.ffffffffffffffp0
+tgamma -0xb8.00000000000001p0
+tgamma -0xbb.ffffffffffffffp0
+tgamma -0xbc.00000000000001p0
+tgamma -0xbc.ffffffffffffffp0
+tgamma -0xbd.00000000000001p0
+tgamma -0xbd.ffffffffffffffp0
+tgamma -0xbe.00000000000001p0
+tgamma -0xbe.ffffffffffffffp0
+tgamma -0xbf.00000000000001p0
+tgamma -0xf9.ffffffffffffffp0
+tgamma -0xfa.00000000000001p0
+tgamma -0x1f3.fffffffffffffep0
+tgamma -0x1f4.00000000000002p0
+tgamma -0x2ed.fffffffffffffcp0
+tgamma -0x2ee.00000000000004p0
+tgamma -0x3e7.fffffffffffffcp0
+tgamma -0x3e8.00000000000004p0
+tgamma -0x4e1.fffffffffffff8p0
+tgamma -0x4e2.00000000000008p0
+tgamma -0x5db.fffffffffffff8p0
+tgamma -0x5dc.00000000000008p0
+tgamma -0x6d5.fffffffffffff8p0
+tgamma -0x6d6.00000000000008p0
+tgamma -0x6e2.fffffffffffff8p0
+tgamma -0x6e3.00000000000008p0
+tgamma -0x6e3.fffffffffffff8p0
+tgamma -0x6e4.00000000000008p0
+tgamma -0x6e4.fffffffffffff8p0
+tgamma -0x6e5.00000000000008p0
+tgamma -0x6e5.fffffffffffff8p0
+tgamma -0x6e6.00000000000008p0
 tgamma 0x8.0000000000000000000000000008p0
 tgamma 0x7.fffffffffffffffffffffffffffcp0
 tgamma 0x7.0000000000000000000000000004p0
@@ -856,64 +852,62 @@ tgamma -0x27.ffffffffffffffffffffffffffep0
 tgamma -0x28.000000000000000000000000002p0
 tgamma -0x28.ffffffffffffffffffffffffffep0
 tgamma -0x29.000000000000000000000000002p0
-# Bug 6810: errno may not be set on underflow.
-tgamma -0x29.ffffffffffffffffffffffffffep0 missing-errno
-tgamma -0x2a.000000000000000000000000002p0 missing-errno
-tgamma -0x31.ffffffffffffffffffffffffffep0 missing-errno
-tgamma -0x32.000000000000000000000000002p0 missing-errno
-tgamma -0x63.ffffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x64.000000000000000000000000004p0 missing-errno
-tgamma -0x95.ffffffffffffffffffffffffff8p0 missing-errno
-tgamma -0x96.000000000000000000000000008p0 missing-errno
-tgamma -0xb4.ffffffffffffffffffffffffff8p0 missing-errno
-tgamma -0xb5.000000000000000000000000008p0 missing-errno
-tgamma -0xb5.ffffffffffffffffffffffffff8p0 missing-errno
-tgamma -0xb6.000000000000000000000000008p0 missing-errno
-tgamma -0xb6.ffffffffffffffffffffffffff8p0 missing-errno
-tgamma -0xb7.000000000000000000000000008p0 missing-errno
-tgamma -0xb7.ffffffffffffffffffffffffff8p0 missing-errno
-tgamma -0xb8.000000000000000000000000008p0 missing-errno
-tgamma -0xbb.ffffffffffffffffffffffffff8p0 missing-errno
-tgamma -0xbc.000000000000000000000000008p0 missing-errno
-tgamma -0xbc.ffffffffffffffffffffffffff8p0 missing-errno
-tgamma -0xbd.000000000000000000000000008p0 missing-errno
-tgamma -0xbd.ffffffffffffffffffffffffff8p0 missing-errno
-tgamma -0xbe.000000000000000000000000008p0 missing-errno
-tgamma -0xbe.ffffffffffffffffffffffffff8p0 missing-errno
-tgamma -0xbf.000000000000000000000000008p0 missing-errno
-tgamma -0xf9.ffffffffffffffffffffffffff8p0 missing-errno
-tgamma -0xfa.000000000000000000000000008p0 missing-errno
-tgamma -0x1f3.ffffffffffffffffffffffffffp0 missing-errno
-tgamma -0x1f4.00000000000000000000000001p0 missing-errno
-tgamma -0x2ed.fffffffffffffffffffffffffep0 missing-errno
-tgamma -0x2ee.00000000000000000000000002p0 missing-errno
-tgamma -0x3e7.fffffffffffffffffffffffffep0 missing-errno
-tgamma -0x3e8.00000000000000000000000002p0 missing-errno
-tgamma -0x4e1.fffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x4e2.00000000000000000000000004p0 missing-errno
-tgamma -0x5db.fffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x5dc.00000000000000000000000004p0 missing-errno
-tgamma -0x6d5.fffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x6d6.00000000000000000000000004p0 missing-errno
-tgamma -0x6e2.fffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x6e3.00000000000000000000000004p0 missing-errno
-tgamma -0x6e3.fffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x6e4.00000000000000000000000004p0 missing-errno
-tgamma -0x6e4.fffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x6e5.00000000000000000000000004p0 missing-errno
-tgamma -0x6e5.fffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x6e6.00000000000000000000000004p0 missing-errno
-tgamma -0x6eb.fffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x6ec.00000000000000000000000004p0 missing-errno
-tgamma -0x6ec.fffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x6ed.00000000000000000000000004p0 missing-errno
-tgamma -0x6ed.fffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x6ee.00000000000000000000000004p0 missing-errno
-tgamma -0x6ee.fffffffffffffffffffffffffcp0 missing-errno
-tgamma -0x6ef.00000000000000000000000004p0 missing-errno
+tgamma -0x29.ffffffffffffffffffffffffffep0
+tgamma -0x2a.000000000000000000000000002p0
+tgamma -0x31.ffffffffffffffffffffffffffep0
+tgamma -0x32.000000000000000000000000002p0
+tgamma -0x63.ffffffffffffffffffffffffffcp0
+tgamma -0x64.000000000000000000000000004p0
+tgamma -0x95.ffffffffffffffffffffffffff8p0
+tgamma -0x96.000000000000000000000000008p0
+tgamma -0xb4.ffffffffffffffffffffffffff8p0
+tgamma -0xb5.000000000000000000000000008p0
+tgamma -0xb5.ffffffffffffffffffffffffff8p0
+tgamma -0xb6.000000000000000000000000008p0
+tgamma -0xb6.ffffffffffffffffffffffffff8p0
+tgamma -0xb7.000000000000000000000000008p0
+tgamma -0xb7.ffffffffffffffffffffffffff8p0
+tgamma -0xb8.000000000000000000000000008p0
+tgamma -0xbb.ffffffffffffffffffffffffff8p0
+tgamma -0xbc.000000000000000000000000008p0
+tgamma -0xbc.ffffffffffffffffffffffffff8p0
+tgamma -0xbd.000000000000000000000000008p0
+tgamma -0xbd.ffffffffffffffffffffffffff8p0
+tgamma -0xbe.000000000000000000000000008p0
+tgamma -0xbe.ffffffffffffffffffffffffff8p0
+tgamma -0xbf.000000000000000000000000008p0
+tgamma -0xf9.ffffffffffffffffffffffffff8p0
+tgamma -0xfa.000000000000000000000000008p0
+tgamma -0x1f3.ffffffffffffffffffffffffffp0
+tgamma -0x1f4.00000000000000000000000001p0
+tgamma -0x2ed.fffffffffffffffffffffffffep0
+tgamma -0x2ee.00000000000000000000000002p0
+tgamma -0x3e7.fffffffffffffffffffffffffep0
+tgamma -0x3e8.00000000000000000000000002p0
+tgamma -0x4e1.fffffffffffffffffffffffffcp0
+tgamma -0x4e2.00000000000000000000000004p0
+tgamma -0x5db.fffffffffffffffffffffffffcp0
+tgamma -0x5dc.00000000000000000000000004p0
+tgamma -0x6d5.fffffffffffffffffffffffffcp0
+tgamma -0x6d6.00000000000000000000000004p0
+tgamma -0x6e2.fffffffffffffffffffffffffcp0
+tgamma -0x6e3.00000000000000000000000004p0
+tgamma -0x6e3.fffffffffffffffffffffffffcp0
+tgamma -0x6e4.00000000000000000000000004p0
+tgamma -0x6e4.fffffffffffffffffffffffffcp0
+tgamma -0x6e5.00000000000000000000000004p0
+tgamma -0x6e5.fffffffffffffffffffffffffcp0
+tgamma -0x6e6.00000000000000000000000004p0
+tgamma -0x6eb.fffffffffffffffffffffffffcp0
+tgamma -0x6ec.00000000000000000000000004p0
+tgamma -0x6ec.fffffffffffffffffffffffffcp0
+tgamma -0x6ed.00000000000000000000000004p0
+tgamma -0x6ed.fffffffffffffffffffffffffcp0
+tgamma -0x6ee.00000000000000000000000004p0
+tgamma -0x6ee.fffffffffffffffffffffffffcp0
+tgamma -0x6ef.00000000000000000000000004p0
 tgamma -0x1.0a32a2p+5
-# Bug 6810: errno may not be set on underflow.
-tgamma -0x1.5800000080001p+7 missing-errno
+tgamma -0x1.5800000080001p+7
 tgamma 18.5
 tgamma 19.5
 tgamma 23.5
@@ -933,6 +927,8 @@ tgamma 0x6.db8c603359a97108p+8
 tgamma 0x6.db8c603359a9711p+8
 tgamma 0x6.db8c603359a971081bc4a2e9dfdp+8
 tgamma 0x6.db8c603359a971081bc4a2e9dfd4p+8
+tgamma 1e3
+tgamma -100000.5
 
 y0 0.125
 y0 0.75
diff --git a/math/w_tgamma.c b/math/w_tgamma.c
index 6b6c7c5..d993917 100644
--- a/math/w_tgamma.c
+++ b/math/w_tgamma.c
@@ -15,6 +15,7 @@
  * depending on the library mode.
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -24,13 +25,15 @@ __tgamma(double x)
 	int local_signgam;
 	double y = __ieee754_gamma_r(x,&local_signgam);
 
-	if(__builtin_expect(!__finite(y), 0)
+	if(__builtin_expect(!__finite(y) || y == 0, 0)
 	   && (__finite (x) || __isinf (x) < 0)
 	   && _LIB_VERSION != _IEEE_) {
 	  if (x == 0.0)
 	    return __kernel_standard(x,x,50); /* tgamma pole */
 	  else if(__floor(x)==x&&x<0.0)
 	    return __kernel_standard(x,x,41); /* tgamma domain */
+	  else if (y == 0)
+	    __set_errno (ERANGE); /* tgamma underflow */
 	  else
 	    return __kernel_standard(x,x,40); /* tgamma overflow */
 	}
diff --git a/math/w_tgammaf.c b/math/w_tgammaf.c
index 8bb553e..952fcec 100644
--- a/math/w_tgammaf.c
+++ b/math/w_tgammaf.c
@@ -13,6 +13,7 @@
  * ====================================================
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -22,7 +23,7 @@ __tgammaf(float x)
 	int local_signgam;
 	float y = __ieee754_gammaf_r(x,&local_signgam);
 
-	if(__builtin_expect(!__finitef(y), 0)
+	if(__builtin_expect(!__finitef(y) || y == 0, 0)
 	   && (__finitef (x) || __isinff (x) < 0)
 	   && _LIB_VERSION != _IEEE_) {
 	  if (x == (float)0.0)
@@ -31,6 +32,9 @@ __tgammaf(float x)
 	  else if(__floorf(x)==x&&x<0.0f)
 	    /* tgammaf domain */
 	    return __kernel_standard_f(x, x, 141);
+	  else if (y == 0)
+	    /* tgammaf underflow */
+	    __set_errno (ERANGE);
 	  else
 	    /* tgammaf overflow */
 	    return __kernel_standard_f(x, x, 140);
diff --git a/math/w_tgammal.c b/math/w_tgammal.c
index 72b247d..556469e 100644
--- a/math/w_tgammal.c
+++ b/math/w_tgammal.c
@@ -18,6 +18,7 @@
  * Return the Gamma function of x.
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -27,13 +28,15 @@ __tgammal(long double x)
 	int local_signgam;
 	long double y = __ieee754_gammal_r(x,&local_signgam);
 
-	if(__builtin_expect(!__finitel(y), 0)
+	if(__builtin_expect(!__finitel(y) || y == 0, 0)
 	   && (__finitel (x) || __isinfl (x) < 0)
 	   && _LIB_VERSION != _IEEE_) {
 	  if(x==0.0)
 	    return __kernel_standard_l(x,x,250); /* tgamma pole */
 	  else if(__floorl(x)==x&&x<0.0L)
 	    return __kernel_standard_l(x,x,241); /* tgamma domain */
+	  else if (y == 0)
+	    __set_errno (ERANGE); /* tgamma underflow */
 	  else
 	    return __kernel_standard_l(x,x,240); /* tgamma overflow */
 	}
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
index a617174..cf55e13 100644
--- a/sysdeps/i386/fpu/libm-test-ulps
+++ b/sysdeps/i386/fpu/libm-test-ulps
@@ -8986,6 +8986,9 @@ ldouble: 1
 Test "tgamma (0x3.8p+0)":
 float: 1
 ifloat: 1
+Test "tgamma (0x3.e8p+8)":
+ildouble: 1
+ldouble: 1
 Test "tgamma (0x3.fffffcp+0)":
 float: 1
 ifloat: 1
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
index 01aa36f..7331577 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -10038,6 +10038,9 @@ ldouble: 1
 Test "tgamma (0x3.8p+0)":
 float: 2
 ifloat: 2
+Test "tgamma (0x3.e8p+8)":
+ildouble: 1
+ldouble: 1
 Test "tgamma (0x3.fffffcp+0)":
 float: 1
 ifloat: 1

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]