<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Dec 8, 2016 at 8:41 PM, Roland Scheidegger <span dir="ltr"><<a href="mailto:sroland@vmware.com" target="_blank">sroland@vmware.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'm wondering, isn't that actually a problem of the test, that is it<br>
can't actually expect reasonable results with such input values?<br>
Since within the shader languages those functions which are composed of<br>
multiple other functions are usually allowed to basically accumulate all<br>
the errors of said functions. Though I agree that results outside [-1,1]<br>
would be odd...<br></blockquote><div><br></div><div>No, not really.  tanh() is well defined on the entire real line and always stays inside the interval (-1, 1).  The problem is just that floating-point arithmatic explodes once x gets large enough.  However, long before that point, it's flattened out to +- 1 (Not mathematically, but as far as floating-point precision is concerned).<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
btw I'm wondering if some vendors wouldn't implement that with slightly<br>
simplified formula, e.g. (e^2x - 1) / (e^2x + 1) (this is what nvidia<br>
used for cg apparently according to docs, saving one of the<br>
exponentials). Might be worse for accuracy though (and won't solve this<br>
problem, though it would now only need a one-sided clamp).<br></blockquote><div><br></div><div>I would be interested to know if that formula would pass the dEQP precision tests...  It would be simpler.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Roland<br>
<div><div class="h5"><br>
Am 09.12.2016 um 02:41 schrieb Haixia Shi:<br>
> Clamp input scalar value to range [-10, +10] to avoid precision problems<br>
> when the absolute value of input is too large.<br>
><br>
> Fixes dEQP-GLES3.functional.shaders.<wbr>builtin_functions.precision.<wbr>tanh.* test<br>
> failures.<br>
><br>
> v2: added more explanation in the comment.<br>
> v3: fixed a typo in the comment.<br>
><br>
> Signed-off-by: Haixia Shi <<a href="mailto:hshi@chromium.org">hshi@chromium.org</a>><br>
> Cc: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>>,<br>
> Cc: Stéphane Marchesin <<a href="mailto:marcheu@chromium.org">marcheu@chromium.org</a>>,<br>
> Cc: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
><br>
> Change-Id: I324c948b3323ff8107127c42934f1<wbr>4459e124b95<br>
> ---<br>
>  src/compiler/glsl/builtin_<wbr>functions.cpp | 13 +++++++++++--<br>
>  1 file changed, 11 insertions(+), 2 deletions(-)<br>
><br>
> diff --git a/src/compiler/glsl/builtin_<wbr>functions.cpp b/src/compiler/glsl/builtin_<wbr>functions.cpp<br>
> index 3e4bcbb..0bacffb 100644<br>
> --- a/src/compiler/glsl/builtin_<wbr>functions.cpp<br>
> +++ b/src/compiler/glsl/builtin_<wbr>functions.cpp<br>
> @@ -3563,9 +3563,18 @@ builtin_builder::_tanh(const glsl_type *type)<br>
>     ir_variable *x = in_var(type, "x");<br>
>     MAKE_SIG(type, v130, 1, x);<br>
><br>
> +   /*<br>
> +    * Clamp x to [-10, +10] to avoid precision problems.<br>
> +    * When x > 10, e^(-x) is so small relative to e^x that it gets flushed to<br>
> +    * zero in the computation e^x + e^(-x). The same happens in the other<br>
> +    * direction when x < -10.<br>
> +    */<br>
> +   ir_variable *t = body.make_temp(type, "tmp");<br>
> +   body.emit(assign(t, min2(max2(x, imm(-10.0f)), imm(10.0f))));<br>
> +<br>
>     /* (e^x - e^(-x)) / (e^x + e^(-x)) */<br>
> -   body.emit(ret(div(sub(exp(x), exp(neg(x))),<br>
> -                     add(exp(x), exp(neg(x))))));<br>
> +   body.emit(ret(div(sub(exp(t), exp(neg(t))),<br>
> +                     add(exp(t), exp(neg(t))))));<br>
><br>
>     return sig;<br>
>  }<br>
><br>
<br>
</div></div>______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</blockquote></div><br></div></div>