commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sébastien Brisard (Commented) (JIRA) <j...@apache.org>
Subject [jira] [Commented] (MATH-722) [math] Complex Tanh for "big" numbers
Date Sun, 11 Dec 2011 08:37:40 GMT

    [ 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

       

Mime
View raw message