私はこの式を持っています
B = tan(atan(A) + C)
ここで、A は入力、B は出力、C は定数です。問題は、sin、cos、および tan 関数は計算コストが高く、4 バイト浮動小数点数として計算すると、式に沿って精度が大幅に低下することです。コードを最適化している最中ですが、計算の総数が数倍になる場合でも、これらの関数を使用しないようにする方法はありますか?
さらなる背景: 数値 A、B、および C は、2 次元平面上の 3 点の x/y 座標の比率です。
私はこの式を持っています
B = tan(atan(A) + C)
ここで、A は入力、B は出力、C は定数です。問題は、sin、cos、および tan 関数は計算コストが高く、4 バイト浮動小数点数として計算すると、式に沿って精度が大幅に低下することです。コードを最適化している最中ですが、計算の総数が数倍になる場合でも、これらの関数を使用しないようにする方法はありますか?
さらなる背景: 数値 A、B、および C は、2 次元平面上の 3 点の x/y 座標の比率です。
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
が遅いか不正確である場合、より高速またはより正確な実装が存在する可能性があります。
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)
これはより効果的かもしれません。兆候に注意してください。
あなたの式は正しいと思います。マークのコメントは本質的に、式が意味を成すためには C が角度の単位を持たなければならないという考えに帰着しますが、C が比率である場合、適切な単位はありません。マークには有効な質問があります。
最後に、正接を計算する必要がありますが、少しは役立つことがあります。
最初に、 sum のタンジェントに単純な三角恒等式を適用します。これを tan(atan(A)) = A という事実と組み合わせると、式は次のようになります。
B = (A + tan(C))/(1 - A*tan(C))
したがって、C のタンジェントを 1 つ計算する必要があります (したがって、tan(C) を 1 回事前計算します)。
ただし、比 sin(C)/cos(C) よりも効率的にタンジェントを計算する方法があります。たとえば、直接級数近似の方が適切な場合があります。または、逆正弦に級数を使用するトリックがあります。これは、正接級数よりも効率的に計算できます。また、角度が小さい場合は、急速に収束する可能性があります。そのバーサインの範囲縮小トリックを使用して、小さな角度を確保できます。他のトリックも存在します。