From: Ulrich Drepper Date: Sat, 6 Oct 2007 18:37:30 +0000 (+0000) Subject: [BZ #4407] X-Git-Tag: cvs/fedora-glibc-20071010T2047~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c039eedd66aff3706fede2188d920e173543b8e8;p=platform%2Fupstream%2Fglibc.git [BZ #4407] * sysdeps/ieee754/dbl-64/e_lgamma_r.c: Fix *signgamp for -0.0. * sysdeps/ieee754/flt-32/e_lgammaf_r.c: Likewise. * sysdeps/ieee754/ldbl-96/e_lgammal_r.c: Likewise. * math/libm-test.inc: Add test for this case. Half the patch by Christian Iseli . --- diff --git a/ChangeLog b/ChangeLog index 08130db..3c8b95d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2007-10-06 Ulrich Drepper + [BZ #4407] + * sysdeps/ieee754/dbl-64/e_lgamma_r.c: Fix *signgamp for -0.0. + * sysdeps/ieee754/flt-32/e_lgammaf_r.c: Likewise. + * sysdeps/ieee754/ldbl-96/e_lgammal_r.c: Likewise. + * math/libm-test.inc: Add test for this case. + [BZ #5010] * sunrpc/svc.c (struct svc_callout): Add sc_mapped element. (svc_register): Initialize sc_mapped. Set to TRUE if call to @@ -29,7 +35,7 @@ * string/bits/string2.h (__strdup): Cast parameters to calloc to avoid warning with -Wconversion. (__strndup): Likewise. - Patch to 50% by Christian Iseli . + Half the patch by Christian Iseli . [BZ #5112] * nscd/connections.c (restart): Don't resync if database is diff --git a/math/libm-test.inc b/math/libm-test.inc index 81dd364..da68d40 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -1,4 +1,4 @@ -/* Copyright (C) 1997-2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1997-2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger , 1997. @@ -3221,6 +3221,9 @@ lgamma_test (void) TEST_f_f (lgamma, plus_infty, plus_infty); TEST_f_f (lgamma, 0, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + check_int ("signgam for lgamma(0) == 1", signgam, 1, 0, 0, 0); + TEST_f_f (lgamma, minus_zero, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + check_int ("signgam for lgamma(-0) == -1", signgam, -1, 0, 0, 0); TEST_f_f (lgamma, nan_value, nan_value); /* lgamma (x) == +inf plus divide by zero exception for integer x <= 0. */ diff --git a/sysdeps/ieee754/dbl-64/e_lgamma_r.c b/sysdeps/ieee754/dbl-64/e_lgamma_r.c index cc44b04..a298a5a 100644 --- a/sysdeps/ieee754/dbl-64/e_lgamma_r.c +++ b/sysdeps/ieee754/dbl-64/e_lgamma_r.c @@ -228,7 +228,12 @@ static double zero= 0.00000000000000000000e+00; *signgamp = 1; ix = hx&0x7fffffff; if(ix>=0x7ff00000) return x*x; - if((ix|lx)==0) return one/fabs(x); + if((ix|lx)==0) + { + if (hx < 0) + *signgamp = -1; + return one/fabs(x); + } if(ix<0x3b900000) { /* |x|<2**-70, return -log(|x|) */ if(hx<0) { *signgamp = -1; diff --git a/sysdeps/ieee754/flt-32/e_lgammaf_r.c b/sysdeps/ieee754/flt-32/e_lgammaf_r.c index 5ebebb7..0ed2610 100644 --- a/sysdeps/ieee754/flt-32/e_lgammaf_r.c +++ b/sysdeps/ieee754/flt-32/e_lgammaf_r.c @@ -164,7 +164,12 @@ static float zero= 0.0000000000e+00; *signgamp = 1; ix = hx&0x7fffffff; if(ix>=0x7f800000) return x*x; - if(ix==0) return one/fabsf(x); + if(ix==0) + { + if (hx < 0) + *signgamp = -1; + return one/fabsf(x); + } if(ix<0x1c800000) { /* |x|<2**-70, return -log(|x|) */ if(hx<0) { *signgamp = -1; diff --git a/sysdeps/ieee754/ldbl-96/e_lgammal_r.c b/sysdeps/ieee754/ldbl-96/e_lgammal_r.c index fecbee9..36e3365 100644 --- a/sysdeps/ieee754/ldbl-96/e_lgammal_r.c +++ b/sysdeps/ieee754/ldbl-96/e_lgammal_r.c @@ -11,9 +11,9 @@ /* Long double expansions are Copyright (C) 2001 Stephen L. Moshier - and are incorporated herein by permission of the author. The author + and are incorporated herein by permission of the author. The author reserves the right to distribute this material elsewhere under different - copying permissions. These modifications are distributed here under + copying permissions. These modifications are distributed here under the following terms: This library is free software; you can redistribute it and/or @@ -302,7 +302,11 @@ __ieee754_lgammal_r (x, signgamp) ix = se & 0x7fff; if ((ix | i0 | i1) == 0) - return one / fabsl (x); + { + if (se & 0x8000) + *signgamp = -1; + return one / fabsl (x); + } ix = (ix << 16) | (i0 >> 16);