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

250 views (last 30 days)

Show older comments

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

##### 2 Comments

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);

### Accepted Answer

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);

##### 6 Comments

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)).

### More Answers (5)

Walter Roberson
on 12 Jun 2011

##### 5 Comments

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

Paulo Silva
on 12 Jun 2011

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

##### 2 Comments

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

##### 1 Comment

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

##### 1 Comment

theodore panagos
on 6 Aug 2023

Ali Ali
on 7 Jun 2024

Edited: Ali Ali
on 7 Jun 2024

##### 2 Comments

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

mod(atan2d(0,1),360) % YES

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.

### See Also

### Categories

### Products

### Community Treasure Hunt

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

Start Hunting!