не используйте обычные квадранты, используйте точки ветвления, определенные линиями y = +/- x, и используйте первые два шага алгоритма, подобного CORDIC (например, вращайте координаты на известный угол и следите за сколько вы повернули):
function atan2_substitute(x,y)
{
double angle = 0;
if (x < y)
{ angle = M_PI; x = -x; y = -y; }
// this guarantees that the angle is between -135 and +45 degrees
if (x < -y)
{
angle -= M_PI/2; tmp = x; x = -y; y = tmp;
}
// this guarantees that the angle is between -45 and +45
angle += atan(y/x);
if (angle > M_PI)
angle -= 2*M_PI;
// fails at 0,0; otherwise is accurate over the entire plane
}
причина для этого заключается в том, что atan () может быть более точным для отношений y / x между -1 и +1, чем для отношений больше 1. (хотя хороший алгоритм atan () будет признай это и возьми ответное)