# Changing the atan function so that it ranges from 0 to 2*pi

250 views (last 30 days)
KA on 12 Jun 2011
Commented: Stephen23 on 8 Jun 2024
I know that the matlab atan function returns values in the range of -pi/2 to pi/2. How do i change it so that it goes over the full range 0 to 2*pi?
My first attempt was using a while loop, but it was incorrect.
I need to write a function mfile to set the built-in matlab function atan in the range of 0 to 2*pi without using atan2. im new to matlab so im unsure of what to do.
Thank you
wenjun kou on 8 Mar 2017
Edited: wenjun kou on 8 Mar 2017
Although you don't want to use atan2, I thought I might just put this out there since atan2 returns a range between -pi to pi:
a = atan2(y, x);
a = a .* (a >= 0) + (a + 2 * pi) .* (a < 0);
Stephen23 on 27 Oct 2018
See Daniel Svedbrand's answer for the simplest solution.

Daniel Svedbrand on 14 Sep 2018
Edited: John D'Errico on 3 Aug 2023
Adding mod 2*pi to atan2 should work just fine
z = mod(atan2(y,x),2*pi);
Feruza Amirkulova on 3 Aug 2023
Yes, mod(atan2(y,x),2*pi) worked and its gradients are the same as for (atan2(y,x)).
John D'Errico on 3 Aug 2023
Edited to remove profanity in the answer.

Walter Roberson on 12 Jun 2011
Paulo Silva on 12 Jun 2011
I didn't include that statement on purpose, when none of the others if statements are true the value of v is NaN, you could also do this:
if isnan(v)
error('Arguments must be different from zero')
end
KA on 12 Jun 2011
ok, did not know that, thanks again

Paulo Silva on 12 Jun 2011
The Wikipedia got all explained, you just need to do the code, it's very simple.
function v=myatan(y,x)
if nargin==1 %just in case the user only gives the value of y myatan(y)
x=1;
end
v=nan;
if x>0
v=atan(y/x);
end
if y>=0 & x<0
v=pi+atan(y/x);
end
if y<0 & x<0
v=-pi+atan(y/x);
end
if y>0 & x==0
v=pi/2;
end
if y<0 & x==0
v=-pi/2;
end
if v<0
v=v+2*pi;
end
end
KA on 12 Jun 2011
Mehmet Can Türk on 9 Apr 2022
Edited: Mehmet Can Türk on 9 Apr 2022
I checked the Wikipedia link and tested the code. First of all, thank you so much for the contribution.
I wanted to convert atan2 function from Matlab into another environment which supports only atan function. So I deleted the if block and everything worked perfectly.

Kent Leung on 21 Mar 2018
Edited: Kent Leung on 21 Mar 2018
Better late than never. (Also posting as a future reference to myself.) The function below accepts y & x as vectors in Matlab. Rather than using 'if' statements, the below might be faster if there is some parallelization implemented in the built-in index searching.
Note: I have a slight disagreement with the above for the x>0 & y<0 case, as well as the for x=0 & y<0 case. The code below gives 0 to 2pi.
function v=myatan(y,x)
%---returns an angle in radians between 0 and 2*pi for atan
v=zeros(size(x));
v(x>0 & y>=0) = atan( y(x>0 & y>=0) ./ x(x>0 & y>=0) );
v(x>0 & y<0) = 2*pi+atan( y(x>0 & y<0) ./ x(x>0 & y<0) );
v(x<0 & y>=0) = pi+atan( y(x<0 & y>=0) ./ x(x<0 & y>=0) );
v(x<0 & y<0) = pi+atan( y(x<0 & y<0) ./ x(x<0 & y<0) );
v(x==0 & y>=0) = pi/2;
v(x==0 & y<0) = 3/2*pi;
end
Sharad Keshari on 26 Nov 2020

theodore panagos on 27 Oct 2018
You can use the formula:
atan(x,y)=pi-pi/2*(1+sgn(x))*(1-sgn(y^2))-pi/4*(2+sgn(x))*sgn(y) -sgn(x*y)*atan((abs(x)-abs(y))/(abs(x)+abs(y)))
x=x2-x1 and y=y2-y1
theodore panagos on 6 Aug 2023
atan2(x,y)=pi/2*(1-sign(x))*(1-sgn(y^2))+pi()/4*(2-sgn(x))*sign(y)-sign(x*y)*atan((abs(x)-abs(y))/(abs(x)+abs(y)))

Ali Ali on 7 Jun 2024
Edited: Ali Ali on 7 Jun 2024
If you want to use atan2(y,x) (atan2(Y,X), returns values in the closed interval [-pi,pi]), considering that atan(b)=atan(b+pi), you can use this equation (use atan2(Y,X) instead of atan(y/x) in this equation) for your work.
DGM on 7 Jun 2024
what?
atan(b) ~= atan(b+pi)
atan(b) ~= atan(b)+pi
atan2(y,x) ~= atan2(y,x)+pi
The angle between the x-axis and a unit vector along x is 0 degrees, not 90 degrees.
atan2d(0,1) + 90 % NO
ans = 90
mod(atan2d(0,1),360) % YES
ans = 0
Stephen23 on 8 Jun 2024
" atan(b)=atan(b+pi) "
Lets check that right now:
b = linspace(-5,5,100);
X = atan(b);
Y = atan(b+pi);
plot(b(:),[X(:),Y(:)])
Nope, not the same. Not even close.

### Categories

Find more on Function Creation in Help Center and File Exchange

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!