diff options
author | Paul Berry <[email protected]> | 2011-09-26 15:51:39 -0700 |
---|---|---|
committer | Paul Berry <[email protected]> | 2011-09-28 12:20:25 -0700 |
commit | 9c7552729971463af015a767e547c43f94fe1212 (patch) | |
tree | 741ac76298fac2bf85ec826b66865b3ae3e644ab /src/mesa/state_tracker/st_draw.c | |
parent | b79782cbedf8b23ea392d9a597eb4831a605bbe0 (diff) |
glsl 1.30: Fix numerical instabilities in asinh
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 to the equivalent formula:
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-*.
Reviewed-by: Chad Versace <[email protected]>
Acked-by: Kenneth Graunke <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker/st_draw.c')
0 files changed, 0 insertions, 0 deletions