OSDN Git Service

lgamma: fix sign handling
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Thu, 10 Jun 2010 20:20:17 +0000 (22:20 +0200)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Thu, 10 Jun 2010 20:23:54 +0000 (22:23 +0200)
add testcase from
http://sourceware.org/bugzilla/show_bug.cgi?id=4407

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
libm/e_lgamma_r.c
test/.gitignore
test/math/Makefile.in
test/math/signgam.c [new file with mode: 0644]

index 2b1fde7..23c96d8 100644 (file)
@@ -208,7 +208,11 @@ double attribute_hidden __ieee754_lgamma_r(double x, int *signgamp)
        *signgamp = 1;
        ix = hx&0x7fffffff;
        if(ix>=0x7ff00000) return x*x;
-       if((ix|lx)==0) return one/zero;
+       if((ix|lx)==0) {
+           if (__signbitl(x))
+               *signgamp = -1;
+           return one/zero;
+       }
        if(ix<0x3b900000) {     /* |x|<2**-70, return -log(|x|) */
            if(hx<0) {
                *signgamp = -1;
index 464130d..2070168 100644 (file)
@@ -119,6 +119,7 @@ math/compile_test
 math/libm-test-ulps.h
 math/libm-test.c
 math/rint
+math/signgam
 math/test-double
 math/test-ildoubl
 math/test-ldouble
index b160c87..8a46e77 100644 (file)
@@ -1,7 +1,7 @@
 # uClibc math tests
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 
-TESTS := basic-test rint tst-definitions test-fpucw test-float test-ifloat test-double test-idouble
+TESTS := basic-test rint signgam tst-definitions test-fpucw test-float test-ifloat test-double test-idouble
 ifeq ($(UCLIBC_HAS_LONG_DOUBLE_MATH),y)
 TESTS += test-ldouble test-ildoubl compile_test
 else
@@ -9,6 +9,7 @@ CFLAGS_basic-test := -DNO_LONG_DOUBLE
 endif
 
 DODIFF_rint     := 1
+DODIFF_signgam  := 1
 
 # NOTE: For basic-test we must disable the floating point optimization.
 #       Only for sh architecture because in the other architecture are disabled.
diff --git a/test/math/signgam.c b/test/math/signgam.c
new file mode 100644 (file)
index 0000000..c60375a
--- /dev/null
@@ -0,0 +1,18 @@
+#define _XOPEN_SOURCE 600
+#include <math.h>
+#include <stdio.h>
+
+double zero = 0.0;
+double mzero;
+
+int
+main (void)
+{
+  double d;
+  mzero = copysign (zero, -1.0);
+  d = lgamma (zero);
+  printf ("%g %d\n", d, signgam);
+  d = lgamma (mzero);
+  printf ("%g %d\n", d, signgam);
+  return 0;
+}