[PATCH libquadmath/PR68686]

Ed Smith-Rowland 3dw4rd@verizon.net
Sun Nov 4 18:24:00 GMT 2018


On 11/3/18 10:09 PM, Jeff Law wrote:
> On 10/23/18 7:45 PM, Ed Smith-Rowland wrote:
>> Greetings,
>>
>> This is an almost trivial patch to get the correct sign for tgammaq.
>>
>> I don't have a testcase as I don't know where to put one.
>>
>> OK?
>>
>> Ed Smith-Rowland
>>
>>
>>
>> tgammaq.CL
>>
>> 2018-10-24  Edward Smith-Rowland  <3dw4rd@verizon.net>
>>
>> 	PR libquadmath/68686
>> 	* math/tgammaq.c: Correct sign for negative argument.
> I don't have the relevant background to evaluate this for correctness.
> Can you refer back to any kind of documentation which indicates what the
> sign of the return value ought to be?
>
> Alternately, if you can point to the relevant code in glibc that handles
> the resultant sign, that'd be useful too.
>
> Note that Joseph's follow-up doesn't touch on the gamma problem AFAICT,
> but instead touches on the larger issues around trying to keep the
> quadmath implementations between glibc and gcc more in sync.
>
> Jeff
>
I've looked at glibc lgamma, in particular signgam and I think those DTRT:


I'm pretty sure the lgamma that write to global signgam and the 
lgamma_r(x, int *signgam) DTRT.

The various __lgamma_neg* DTRT:

__lgamma_negX (REALTYPE x, int *signgamp)
{
   /* Determine the half-integer region X lies in, handle exact
      integers and determine the sign of the result.  */
   int i = __floorl (-2 * x);
   if ((i & 1) == 0 && i == -2 * x)
     return 1.0L / 0.0L;
   long double xn = ((i & 1) == 0 ? -i / 2 : (-i - 1) / 2);
   i -= 4;
   *signgamp = ((i & 2) == 0 ? -1 : 1);
...

I think the various e_lgammaX_r.c are good too:

   if (se & 0x8000)
     {
       if (x < -2.0L && x > -33.0L)
     return __lgamma_negl (x, signgamp);
       t = sin_pi (x);
       if (t == zero)
     return one / fabsl (t);    /* -integer */
       nadj = __ieee754_logl (pi / fabsl (t * x));
       if (t < zero)
     *signgamp = -1;
       x = -x;
     }

I *do* think a couple tests should be added to test-signgam-*.c to test 
alternation of signs:
       signgam = 123;                        \
       c = FUNC (b);                        \
       if (signgam == 1)                        \

     puts ("PASS: " #FUNC " (-1.5) setting signgam");    \

       else                            \
     {                            \
       puts ("FAIL: " #FUNC " (-1.5) setting signgam");    \
       result = 1;                        \
     }                            \

Add to test lgamma_negX code paths...
       signgam = 123;                        \
       c = FUNC (b);                        \
       if (signgam == -1)                    \
     puts ("PASS: " #FUNC " (-34.5) setting signgam");    \
       else                            \
     {                            \
       puts ("FAIL: " #FUNC " (-34.5) setting signgam"); \
       result = 1;                        \
     }                            \
       signgam = 123;                        \
       c = FUNC (b);                        \
       if (signgam == 1)                        \
     puts ("PASS: " #FUNC " (-35.5) setting signgam");    \
       else                            \
     {                            \
       puts ("FAIL: " #FUNC " (-35.5) setting signgam"); \
       result = 1;                        \
     }                            \


I've not dealt with glibc directly.  Do I need separate Copyright and 
all that?  Is it similar to gcc in terms of devel?




More information about the Gcc-patches mailing list