# [Mathematica] ArcTan[] bug ?

• Mathematica

## Main Question or Discussion Point

Hello everyone,

I copy-paste here a little bit of code:
Code:
In[4417]:= x = (1.5 + 0. I);
y = (0. + 0. I);

(* 1 *) ArcTan[x, y]
(* 2 *) ArcTan[x // Chop, y // Chop]
(* 3 *) -I Log[(x + I y)/Sqrt[x^2 + y^2]]
{y == 0, Re[y] == 0, Im[y] == 0, Im[x] == 0}

Out[4419]= -1.5708 + 0. I

Out[4420]= 0

Out[4421]= 0. + 0. I

Out[4422]= {True, True, True, True}
The quantities x and y are calculated elsewhere.
The expression 1 for the arctangent is wrong since it gives me -pi/2
In expression 2, I chop the arguments and the result is right.
Expression 3 is used when x or y is complex and gives the right answer as well.
Finally, some tests…

Any thoughts ?
TIA

Related MATLAB, Maple, Mathematica, LaTeX News on Phys.org
phyzguy
I agree it looks wrong, but I think ArcTan[x,y] is assuming x and y are both real. It must have a problem when thy are complex.

The help page of ArcTan[x,y] indicates that it can handle complex arguments. It then uses the expression which involves the Log[] I gave.
Problem is: my quantities x and y are not complex according to the tests I make… Which is strange because I thought that the number 0.` is different from 0 (== wise)…

phyzguy
ArcTan[x] should handle complex arguments, but what does ArcTan[x,y] even mean when the arguments are complex?

Hurkyl
Staff Emeritus
Gold Member
Hurkyl
Staff Emeritus
Gold Member
WTF ?! This is clearly broken, no ?
No and yes.

No, in the sense that you should expect numerical algorithms to misbehave at special values. Yes, in the sense that it's a little surprising these values are special.

What's most likely happening internally is that there is an algebraic identity being used and your point is right on a branch cut of the terms involved. And because your numbers are approximate, different sides of the branch cut wind up being used in different terms.

I see now… :)
Well, that doesn't solve my problem: I now have a function of this angle (I use this ArcTan[] to calculate an angle, obviously) which is discontinuous at one point… I'll have to make a specific test to avoid this very point.

Thanks :)