Modify ↓
Opened 5 years ago
Closed 5 years ago
#7291 closed Bugs (fixed)
complex atan is not the best it could be
Reported by: | Stephen Montgomery-Smith <stephen@…> | Owned by: | johnmaddock |
---|---|---|---|
Milestone: | To Be Determined | Component: | math |
Version: | Boost 1.52.0 | Severity: | Problem |
Keywords: | Cc: |
Description
For complex atan, when x and y are non-negative, the following formula is rather foolproof:
atanh(z) = 0.25 * log1p(4*x / pow(|z-1|,2)) + 0.5 * I * atan2(2y, (1-x*x-y*y))
where z = x+I*y. Just handle the few special cases when you get overflow or underflow.
I have implemented a C version at http://people.freebsd.org/~stephen/catrig.c.
Also, email Tom Fairgrieve <tff@…>. He has an unpublished work by Hull, himself, and Tang, very similar to the work they did on the complex arcsine.
Attachments (1)
Change History (5)
comment:1 Changed 5 years ago by johnmaddock
- Component changed from None to math
- Owner set to johnmaddock
comment:2 Changed 5 years ago by Stephen Montgomery-Smith <stephen@…>
Changed 5 years ago by Stephen Montgomery-Smith <stephen@…>
comment:3 Changed 5 years ago by Stephen Montgomery-Smith <stephen@…>
The patch I just uploaded is a diff to today's svn. It seems to work rather well.
Note: See
TracTickets for help on using
tickets.
Use this for the imaginary part: 0.5 * atan2(2y, (1-x)*(1+x)-y*y) Replacing 1-x*x by (1-x)(1+x) improves the error quite a bit when x is close to 1.