Косинус и синус можно сделать так
public class FixedMath
{
static Fixed zero = new Fixed(0);
static Fixed angle0 = new Fixed(0);
static Fixed angle90 = new Fixed(90);
static Fixed angle180 = new Fixed(180);
static Fixed angle270 = new Fixed(270);
static Fixed angle360 = new Fixed(360);
static Fixed[] cosValues;
static
{
//читаем из файла сохраненные значения для cos 0 - 90
}
public static Fixed cos(Fixed angle)
{
angle = correctAngle(angle);
if( angle.compareTo(angle270) > 0 )
{
return findValue(angle360.sub(angle));
}
if( angle.compareTo(angle180) > 0 )
{
return findValue(angle.sub(angle180)).neg();
}
if( angle.compareTo(angle90) > 0 )
{
return findValue(angle180.sub(angle)).neg();
}
return findValue(angle);
}
public static Fixed sin(Fixed angle)
{
return cos( angle.sub(angle90) );
}
static Fixed correctAngle(Fixed angle)
{
while( angle.compareTo(angle0) < 0 )
{
angle = angle.add(angle360);
}
while( angle.compareTo(angle360) > 0 )
{
angle = angle.sub(angle360);
}
return angle;
}
static Fixed findValue(Fixed angle)
{
Fixed step = angle90.div(new Fixed(cosValues.length));
Fixed current = step;
for(int i = 0; i < cosValues.length; ++i)
{
if( angle.compareTo(current) < 0 ) return cosValues[i];
current = current.add(step);
}
return zero;
}
}
90 - 180: cos(x) = -cos(180 - x)
180 - 270: cos(x) = -cos(x - 180)
270-360: cos(x) = cos(360 - x)
sin(x) = cos(x - 90)
Углы в градусах, если нужно сделать в радианах, нужно только изменить константы angleXXX