私はいくつかの剛体回転力学シミュレーションを行っています。つまり、小さな角度で多くの回転を計算する必要があり、三角関数の評価でパフォーマンスのボトルネックとなっています。今、私は Taylor(McLaurin) シリーズでそれを行います:
class double2{
double x,y;
// Intristic full sin/cos
final void rotate ( double a){
double x_=x;
double ca=Math.cos(a); double sa=Math.sin(a);
x=ca*x_-sa*y; y=sa*x_+ca*y;
}
// Taylor 7th-order aproximation
final void rotate_d7( double a){
double x_=x;
double a2=a*a;
double a4=a2*a2;
double a6=a4*a2;
double ca= 1.0d - a2 /2.0d + a4 /24.0d - a6/720.0d;
double sa= a - a2*a/6.0d + a4*a/120.0d - a6*a/5040.0d;
x=ca*x_-sa*y; y=sa*x_+ca*y;
}
}
しかし、パフォーマンス速度のトレードは、私が期待するほど大きくはありません:
error(100x dphi=Pi/100 ) time [ns pre rotation]
v.rotate_d1() : -0.010044860504615213 9.314306 ns/op
v.rotate_d3() : 3.2624666136960023E-6 16.268745 ns/op
v.rotate_d5() : -4.600003294941146E-10 35.433617 ns/op
v.rotate_d7() : 3.416711358283919E-14 49.831547 ns/op
v.rotate() : 3.469446951953614E-16 75.70213 ns/op
小さな角度 (< Pi/100 など) の sin() および cos() の近似値を評価するより高速な方法はありますか?
私はおそらくいくつかの有理級数、または連続分数近似を考えていましたか?何でも知ってますか?(事前計算されたテーブルはここでは意味がありません)