# define PiOv2 (3.14159f / 2.0f)
# define SignBit(f) ((*(const unsigned long *)&(f)) >> 31)
float Atan_16bits_Pre( float y, float x )
{
float a, s;
if ( fabs( y ) > fabs( x ) )
{
a = x / y;
s = a * a;
s = - ( ( ( ( ( ( ( ( ( 0.0028662257f * s - 0.0161657367f ) * s + 0.0429096138f ) * s - 0.0752896400f )
* s + 0.1065626393f ) * s - 0.1420889944f ) * s + 0.1999355085f ) * s - 0.3333314528f ) * s ) + 1.0f ) * a;
if ( SignBit( a ) ) {
return s - PiOv2;
} else {
return s + PiOv2;
}
}
else
{
a = y / x;
s = a * a;
return ( ( ( ( ( ( ( ( ( 0.0028662257f * s - 0.0161657367f ) * s + 0.0429096138f ) * s - 0.0752896400f )
* s + 0.1065626393f ) * s - 0.1420889944f ) * s + 0.1999355085f ) * s - 0.3333314528f ) * s ) + 1.0f ) * a;
}
}
atan(x,y)需要CPU浮点指令级支持,AVR中一般没有专用浮点单元,所以atan也是软件实现的。如果你在AVR的库中一时没有找到atan,可以用上面这段程序代替,注意,上面程序只提供了两字节精度支持,大概小数点后3位左右。
上述程序来至id的4号引擎,基本上都是大神写的,你很难找到一段效率比它还高的代码,上述代码在一定情况下和浮点指令的速度差不多。
你看看 math.h