[Mesa-dev] [PATCH] glsl 1.30: Fix numerical instabilities in asinh
Paul Berry
stereotype441 at gmail.com
Tue Sep 27 10:14:11 PDT 2011
On 27 September 2011 10:12, Chad Versace <chad at chad-versace.us> wrote:
> On 09/26/2011 04:19 PM, Paul Berry wrote:
>
>> The formula we were previously using for asinh:
>>
>> asinh x = ln(x + sqrt(x * x + 1))
>>
>> is numerically unstable: when x is a large negative value, the quantity
>>
>> x + sqrt(x * x + 1)
>>
>> is a small positive value (on the order of 1/(2|x|)). Since the
>> logarithm function is very sensitive in this range, any error in the
>> computation of the square root manifests as a large error in the
>> result.
>>
>> This patch changes the formula to:
>>
>> asinh x = sign(x) * ln(abs(x) + sqrt(x * x + 1))
>>
>> which is only slightly more expensive to compute, and is numerically
>> stable for all x.
>>
>> Fixes piglit tests
>> spec/glsl-1.30/execution/**built-in-functions/[fv]s-**asinh-*.
>> ---
>> src/glsl/builtins/ir/asinh | 40 ++++++++++++++++++++++++++++++**
>> ++++++----
>> 1 files changed, 36 insertions(+), 4 deletions(-)
>>
>
> I would mention in the commit message that the new formula is
> equivalent to the old. This isn't evident at first glance, and I
> first thought that the new was perhaps just a good, stable approximation
> of the old.
>
Good point. I'll update the commit message. Thanks for the review.
>
> Reviewed-by: Chad Versace <chad at chad-versace.us>
>
> --
> Chad Versace
> chad at chad-versace.us
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110927/4698953b/attachment-0001.htm>
More information about the mesa-dev
mailing list