No Multiplication Algorithm in MATLAB:
32/Pi X arc-tangent of (x,y) using 4 most significant digits of (x or y)
%16x16 quadrant look-up table:
ATAN2(1,1:16)= fi([ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ],0,4,0);
ATAN2(2,1:16)= fi([ 0 8 11 13 13 14 14 14 15 15 15 15 15 15 15 15 ],0,4,0);
ATAN2(3,1:16)= fi([ 0 5 8 10 11 12 13 13 13 14 14 14 14 14 14 14 ],0,4,0);
ATAN2(4,1:16)= fi([ 0 3 6 8 9 10 11 12 12 13 13 13 13 13 14 14 ],0,4,0);
ATAN2(5,1:16)= fi([ 0 2 5 6 8 9 10 11 11 12 12 12 13 13 13 13 ],0,4,0);
ATAN2(6,1:16)= fi([ 0 2 4 5 7 8 9 10 10 11 11 11 12 12 12 13 ],0,4,0);
ATAN2(7,1:16)= fi([ 0 2 3 5 6 7 8 9 9 10 10 11 11 11 12 12 ],0,4,0);
ATAN2(8,1:16)= fi([ 0 1 3 4 5 6 7 8 9 9 10 10 10 11 11 11 ],0,4,0);
ATAN2(9,1:16)= fi([ 0 1 2 4 5 6 6 7 8 8 9 9 10 10 11 11 ],0,4,0);
ATAN2(10,1:16)=fi([ 0 1 2 3 4 5 6 7 7 8 8 9 9 10 10 10 ],0,4,0);
ATAN2(11,1:16)=fi([ 0 1 2 3 4 5 5 6 7 7 8 8 9 9 10 10 ],0,4,0);
ATAN2(12,1:16)=fi([ 0 1 2 3 3 4 5 6 6 7 7 8 8 9 9 9 ],0,4,0);
ATAN2(13,1:16)=fi([ 0 1 2 2 3 4 5 5 6 6 7 7 8 8 9 9 ],0,4,0);
ATAN2(14,1:16)=fi([ 0 1 2 2 3 4 4 5 6 6 7 7 7 8 8 9 ],0,4,0);
ATAN2(15,1:16)=fi([ 0 1 1 2 3 3 4 5 5 6 6 7 7 8 8 8 ],0,4,0);
ATAN2(16,1:16)=fi([ 0 1 1 2 3 3 4 4 5 5 6 6 7 7 8 8 ],0,4,0);
CMP7=fi([0 127 0 0],0,7,0); % using look-up instead if if-end
CMPA=fi([31 0 31 0],0,5,0); % using look-up instead if if-end
X=int32(x);
Y=int32(y);
XsN=bitget(X,32);
YsN=bitget(Y,32);
XSM=uint16(bitshift(XsN+bitxor(CMP(1+XsN),X),-16));
YSM=uint16(bitshift(YsN+bitxor(CMP(1+YsN),Y),-16));
XYSM=bitor(bitor(XSM,YSM),uint16(15));
XYSM=bitset(XYSM,15,or(bitget(XYSM,16),bitget(XYSM,15)));
XYSM=bitset(XYSM,14,or(bitget(XYSM,15),bitget(XYSM,14)));
XYSM=bitset(XYSM,13,or(bitget(XYSM,14),bitget(XYSM,13)));
XYSM=bitset(XYSM,12,or(bitget(XYSM,13),bitget(XYSM,12)));
XYSM=bitset(XYSM,11,or(bitget(XYSM,12),bitget(XYSM,11)));
XYSM=bitset(XYSM,10,or(bitget(XYSM,11),bitget(XYSM,10)));
XYSM=bitset(XYSM,9,or(bitget(XYSM,10),bitget(XYSM,9)));
XYSM=bitset(XYSM,8,or(bitget(XYSM,9),bitget(XYSM,8)));
XYSM=bitset(XYSM,7,or(bitget(XYSM,8),bitget(XYSM,7)));
XYSM=bitset(XYSM,6,or(bitget(XYSM,7),bitget(XYSM,6)));
XYSM=bitset(XYSM,5,or(bitget(XYSM,6),bitget(XYSM,5)));
XYSM=bitset(XYSM,4,or(bitget(XYSM,5),bitget(XYSM,4)));
XYSM=bitset(XYSM,3,or(bitget(XYSM,4),bitget(XYSM,3)));
XYSM=bitset(XYSM,2,or(bitget(XYSM,3),bitget(XYSM,2)));
XYSM=bitset(XYSM,1,or(bitget(XYSM,2),bitget(XYSM,1)));
XYSh=bitget(XYSM,1)+bitget(XYSM,2)+bitget(XYSM,3)+bitget(XYSM,4)+bitget(XYSM,5)+bitget(XYSM,6)+bitget(XYSM,7)+bitget(XYSM,8)+bitget(XYSM,9)+bitget(XYSM,10)+bitget(XYSM,11)+bitget(XYSM,12)+bitget(XYSM,13)+bitget(XYSM,14)+bitget(XYSM,15)+bitget(XYSM,16);
XS = fi(0,0,5,0);
YS = fi(0,0,5,0);
XS = bitset(XS,4,bitget(XSM,XYSh));
XS = bitset(XS,3,bitget(XSM,XYSh-1));
XS = bitset(XS,2,bitget(XSM,XYSh-2));
XS = bitset(XS,1,bitget(XSM,XYSh-3));
YS = bitset(YS,4,bitget(YSM,XYSh));
YS = bitset(YS,3,bitget(YSM,XYSh-1));
YS = bitset(YS,2,bitget(YSM,XYSh-2));
YS = bitset(YS,1,bitget(YSM,XYSh-3));
XsZ = XS==0;
XsP = ~or(XsZ,XsN);
XsN = ~or(XsZ,XsP);
YsZ = YS==0;
YsP = ~or(YsZ,YsN);
YsN = ~or(YsZ,YsP);
Quad2 = or(and(XsZ,YsP),and(XsN,YsP));
Quad3 = or(and(XsN,YsZ),and(XsN,YsN));
Quad4 = or(and(XsZ,YsN),and(XsP,YsN));
Quadf = or(Quad4,Quad2)+1;
Quad=bitand(CMP7(Quad2+1),fi(16,0,7,0))+bitand(CMP7(Quad3+1),fi(32,0,7,0))+bitand(CMP7(Quad4+1),fi(48,0,7,0));
AnswerX32overPi=fi(ATAN2(1+bitand(CMPA(Quadf),XS)+bitand(CMPA(Quadf+1),YS)+bitshift(fi(bitand(CMPA(Quadf),YS)+bitand(CMPA(Quadf+1),XS),0,8,0),4))+Quad,1,7,0);
atan2
. Not sure if you can get by without a division, though. $\endgroup$atan2
. You will still need a division though. $\endgroup$