0

私はいくつかの剛体回転力学シミュレーションを行っています。つまり、小さな角度で多くの回転を計算する必要があり、三角関数の評価でパフォーマンスのボトルネックとなっています。今、私は 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() の近似値を評価するより高速な方法はありますか?

私はおそらくいくつかの有理級数、または連続分数近似を考えていましたか?何でも知ってますか?(事前計算されたテーブルはここでは意味がありません)

4

5 に答える 5

0

インラインアセンブラを追加できますか?i386 'fsincos' 命令をターゲットにするのがおそらく最速の方法です:

Vector2 unit_vector ( Angle angle ) {
  Vector2 r;

//now the normal processor detection
//and various platform specific vesions

#  if defined (__i386__) && !defined (NO_ASM)
#    if defined __GNUC__
#      define ASM_SINCOS
      asm ("fsincos" : "=t" (r.x), "=u" (r.y) : "0" (angle.radians()));

#    elif defined _MSC_VER
#      define ASM_SINCOS
      double a = angle.radians();
      __asm fld a
      __asm fsincos
      __asm fstp r.x
      __asm fstp r.y
#    endif
#  endif
}

ここから。これには、1 回の呼び出しで sin と cos の両方を計算できるという追加のボーナスがあります。

編集:Javaです。

ローテーションは、JNI を介して一度に数千をオフロードできるように適切に自己完結していますか? そうでなければ、このハードウェア固有のアプローチは役に立ちません。

于 2013-08-09T13:10:13.953 に答える
0

小さな x (ラジアンで x<0.2) の場合、安全に sin(x) = x と仮定できます。

最大偏差は 0.0013 です。

于 2016-09-12T16:57:26.927 に答える