0

私はこの式を持っています

B = tan(atan(A) + C)

ここで、A は入力、B は出力、C は定数です。問題は、sin、cos、および tan 関数は計算コストが高く、4 バイト浮動小数点数として計算すると、式に沿って精度が大幅に低下することです。コードを最適化している最中ですが、計算の総数が数倍になる場合でも、これらの関数を使用しないようにする方法はありますか?

さらなる背景: 数値 A、B、および C は、2 次元平面上の 3 点の x/y 座標の比率です。

4

3 に答える 3

1

Wolfram Alphaによると、 のtan(atan(A)+C)ように記述できます(A+tan(C))/(1-A*tan(C))

これは、正接和の式から手で簡単に導き出すことができます。

tan(a + b) = (tan a + tan b)/(1 - tan a tan b)。

数学ライブラリの の実装tanが遅いか不正確である場合、より高速またはより正確な実装が存在する可能性があります。

于 2012-09-27T12:52:52.127 に答える
0

atan(A) = atan(x_a/y_a)ある点は、ベクトル(x_a,y_a)と Oy の間の角度です。C は定数であるため、c=(x_c,y_c)単位長さを持ち、角度 C で Oy に傾いたベクトルを事前に計算できます。次に、cos(atan(A)+C) は、これらのベクトルを a の長さで割った内積として表すことができます。cos から、メイン ID を使用して tan を取得できます。最後に得た:

B = sqrt((x_a^2 + y_a^2)/(x_a*x_c + y_a*y_c)^2 - 1)

これはより効果的かもしれません。兆候に注意してください。

于 2012-10-02T11:10:20.800 に答える
0

あなたの式は正しいと思います。マークのコメントは本質的に、式が意味を成すためには C が角度の単位を持たなければならないという考えに帰着しますが、C が比率である場合、適切な単位はありません。マークには有効な質問があります。

最後に、正接を計算する必要がありますが、少しは役立つことがあります。

最初に、 sum のタンジェントに単純な三角恒等式を適用します。これを tan(atan(A)) = A という事実と組み合わせると、式は次のようになります。

B = (A + tan(C))/(1 - A*tan(C))

したがって、C のタンジェントを 1 つ計算する必要があります (したがって、tan(C) を 1 回事前計算します)。

ただし、比 sin(C)/cos(C) よりも効率的にタンジェントを計算する方法があります。たとえば、直接級数近似の方が適切な場合があります。または、逆正弦に級数を使用するトリックがあります。これは、正接級数よりも効率的に計算できます。また、角度が小さい場合は、急速に収束する可能性があります。そのバーサインの範囲縮小トリックを使用して、小さな角度を確保できます。他のトリックも存在します。

于 2012-09-27T13:12:16.823 に答える