Atan(y,x) for complex numbers

There doesn’t seem to be an implementation for atan when x and y are complex numbers. The currently implement atan(y/x) is not a replacement, as it loses the information on which quadrants x and y are in.

This is important for spherical harmonics and converting to spherical coordinates in the complex domain.

One potential solution is the default Mathematica uses, which is to define:

atan(x::Complex,y::Complex) = - im * log( (x+y*im)/sqrt(x^2+y^2) )

You can test this does get the right quadrants with:

Using LinearAlgebra
maximum(
map(1:10000) do i
x = rand(-1.001:0.01:1.0) + rand(-1.001:0.01:1.0)*im
y = rand(-1.001:0.01:1.0) + rand(-1.001:0.01:1.0)im
r = sqrt(x^2 + y^2) # note this is a complex number
θ = atan(y,x)
norm( [x,y] - r .
[cos(θ),sin(θ)] )
end
)

For several packages I now add this definition to use (what is in my field) standard coordinate transforms.

3 Likes

It seems like this could easily be added just below this line:

https://github.com/JuliaLang/julia/blob/c2abaeedf8316a392035ff63fa6460595a9a5dd3/base/math.jl#L698

Would probably make for quite a straightforward PR, if you’d like.

2 Likes

Seems like ruby’s cmath has this as well:

1 Like

Yes , if you can, please do create a PR. Am now trying to build Julia for the first time etc… before making my first PR.

2 Likes

You can make a one line PR easily from Github without evening building Julia locally: just click “edit”, make the change, and “propose file change”. The CI will test you’re change, though you’ll probably need to also add tests.

5 Likes