You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Sébastien Brisard (Commented JIRA)" <ji...@apache.org> on 2011/12/11 09:37:40 UTC

[jira] [Commented] (MATH-722) [math] Complex Tanh for "big" numbers

    [ https://issues.apache.org/jira/browse/MATH-722?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13167068#comment-13167068 ] 

Sébastien Brisard commented on MATH-722:
----------------------------------------

Even when a is not large enough to cause overflows, I'm not sure the general expression used is quite accurate (because {{cosh(2 * a)}} and {{sinh(2 * a)}} are very close, but not equal). I've often come accross this issue, and found that reverting to exponential representation (keeping only the exponentials with negative argument) was much better behaved.

In the present case, maybe the following representation of the real part
{{(1 - exp(-4 * a)) / (1 + 2 * exp(-2 * a) * cos(2 * b) + exp(-4 * a))}}
would avoid overflows (for {{a > 0}}, while remaining fairly accurate (otherwise, the threshold needs to be tuned).

Similar expressions can be derived for {{a < 0}}.

What do you think?
Sébastien
                
> [math] Complex Tanh for "big" numbers
> -------------------------------------
>
>                 Key: MATH-722
>                 URL: https://issues.apache.org/jira/browse/MATH-722
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 2.2
>         Environment: I'm working with Eclipse 3.6.2 on Windows XP, but the bug is Enviroment independent
>            Reporter: Juan Barandiaran
>            Priority: Minor
>              Labels: patch
>   Original Estimate: 0.25h
>  Remaining Estimate: 0.25h
>
> Hi,
> In Complex.java the tanh is computed with the following formula:
> tanh(a + bi) = sinh(2a)/(cosh(2a)+cos(2b)) + [sin(2b)/(cosh(2a)+cos(2b))]i
> The problem that I'm finding is that as soon as "a" is a "big" number,
> both sinh(2a) and cosh(2a) are infinity and then the method tanh returns in
> the real part NaN (infinity/infinity) when it should return 1.0.
> Wouldn't it be appropiate to add something as in the FastMath library??:
> if (real>20.0){
>       return createComplex(1.0, 0.0);
> }
> if (real<-20.0){
>       return createComplex(-1.0, 0.0);
> }
> Best regards,
> JBB

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira