Subject: Increasing the accuracy of Gamma for double float
From: Raymond Toy
Date: Fri, 14 Nov 2008 14:45:01 -0500
Dieter Kaiser wrote:
> Ray wrote:
>> I am looking into this again, finally. I was wondering why you made
>> the following change to gamma-lanczos:
>>
>> (let* ((z (- z 1))
>> (zh (+ z 1/2))
>> (zgh (+ zh 607/128))
>> ;; Calculate log(zp) to avoid overflow at this point.
>> (lnzp (* (/ zh 2) (log zgh)))
>>
>> You say it overflows, but I don't see it. It used to be zp =
>> zgh^(zh/2).
>>
>> For z up to at least 200, this would not overflow. Yes, the final
>> result will overflow when we compute zp*exp(-zgh)*zp, but that's to be
>> expected. zp was done this way so we wouldn't prematurely overflow.
>
> Yes, zp overflows not as fast as the result. I think I have tried to avoid an
> overflow of an intermediate result. Another possible was to to catch an error
> for the whole calculation. When we get an overflow of an intermediate result I
> expect again a Lisp error with CLISP. GCL might continue the calculation and the
> test and the end of the function might be enough.
Ah, ok. I understand the problem now. I think we can move the
calculation of zp into the ignore-errors part, and that should take care
of it. Using log loses accuracy, so we should avoid that if possible.
Ray