Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

New to MATLAB?

atand(x) very much slower than atan(x)!?

Asked by Ernst Jan

Ernst Jan (view profile)

on 28 Mar 2013

Today I used atand(x) and atan(x). To my great surprise atand(x) was not just a little bit slower than atan(x) but is incredibly slow compared to atan(x)?

I tried to verify this by using the code below. First a time measurement for atan(x), than for atan(x) multiplied with 360/2/pi to go to degrees and finally one loop for atand(x). The results I found were:

Elapsed time is 0.047019 seconds. -> atan(x)

Elapsed time is 0.062016 seconds. -> atan(x)*360/2/pi

Elapsed time is 4.166911 seconds. -> atand(x)

And finally a test to check if atand(x) yielded identical results to atan(x) which was 'true' for all arguments tested.

This would mean that one should never use atan2d because atan2(x)*360/2/pi is much and much quicker? Why is there even a atan2d(x) function or why is it so slow?

Kind regards,

Ernst Jan Grift

clear all
n=1000000;
x_rad=zeros(1,n);
x_rad_to_d=zeros(1,n);
x_d=zeros(1,n);
arg=rand(1,n);
tic
for i=1:n
    x_rad(i)=atan(arg(n));
end
toc
tic
for i=1:n
    x_rad_to_d(i)=atan(arg(n))*360/2/pi;
end
toc
tic
for i=1:n
    x_d(i)=atand(arg(n));
end
toc
same=x_rad_to_d==x_d;
all(same)

0 Comments

Ernst Jan

Ernst Jan (view profile)

Products

No products are associated with this question.

2 Answers

Answer by Sean de Wolski

Sean de Wolski (view profile)

on 28 Mar 2013
Accepted answer

I don't see any record of this; please file an enhancement request.

1 Comment

Ernst Jan

Ernst Jan (view profile)

on 28 Mar 2013

A service request has been submitted. Both atand(x) and atan2d(x) show this slow behaviour.

Sean de Wolski

Sean de Wolski (view profile)

Answer by Matt J

Matt J (view profile)

on 28 Mar 2013
Edited by Matt J

Matt J (view profile)

on 28 Mar 2013

Your observation is interesting, but I don't think the conclusion is that you should never use ATAND, but only that it hasn't been well-optimized for the JIT yet, and shouldn't be used in for-loops. When vectorized, its performance is fine,

    n=1e7;
    arg=rand(1,n);
    tic
        x_rad=atan(arg);
    toc
    %Elapsed time is 0.106370 seconds.    
    tic
        x_rad_to_d=atan(arg)*180/pi;
    toc
    %Elapsed time is 0.111417 seconds.    
    tic
        x_d=atand(arg);
    toc
    %Elapsed time is 0.115595 seconds.

0 Comments

Matt J

Matt J (view profile)

Contact us