#include #include #define PI 3.14159265358979323844 double angle; double coeff_1 = PI/4.0; double coeff_2 = 3.0*(PI/4.0); double abs_y; //----------------------------------------------- // Fast arctan2 double arctan2(double y, double x) { double r; //coeff_1 = pi/4; //coeff_2 = 3*coeff_1; abs_y = fabs(y)+1e-10; // kludge to prevent 0/0 condition if (x>=0) { r = (x - abs_y) / (x + abs_y); angle = coeff_1 - coeff_1 * r; } else { r = (x + abs_y) / (abs_y - x); angle = coeff_2 - coeff_1 * r; } if (y < 0) return(-angle); // negate if in quad III or IV else return(angle); } int main() { double x,y,mag; printf("#\n#\n#1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n#\n"); for (x=-2.0;x<=2.0;x+=0.001) { for(y=-2.0;y<=2.0;y+=0.001) { mag = sqrt(x*x+y*y); if ( mag < 1.6 && mag > 1.4 ) { printf ( " x %f y %f mag %f atan2 %f arctan2 %f diff %f diffdeg %f\n", x, y, sqrt(x*x+y*y), atan2(y,x) * 360.0/(2*PI) , arctan2(y,x) * 360.0/(2*PI) , atan2(y,x) - arctan2(y,x), 360.0/(2*PI) * (atan2(y,x) - arctan2(y,x) ) ); } } } return 0; }