[Mesa-dev] [PATCH] glsl 1.30: Fix numerical instabilities in asinh

Kenneth Graunke kenneth at whitecape.org
Tue Sep 27 11:33:58 PDT 2011


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-*.

Acked-by: Kenneth Graunke <kenneth at whitecape.org>

I just looked up the formula and implemented that, back in the 
day...this whole numerical instability thing is foreign to me.  Thanks 
for improving this.


More information about the mesa-dev mailing list