108

ですから、高校の数学、そしておそらく大学では、三角関数の使い方、その機能、およびどのような種類の問題を解くかを教えられます。しかし、それらは常にブラックボックスとして私に提示されてきました. 何かの正弦または余弦が必要な場合は、電卓の正弦ボタンまたは余弦ボタンを押すだけで準備完了です。それは結構です。

私が疑問に思っているのは、三角関数が通常どのように実装されているかです。

4

7 に答える 7

149

まず、何らかの範囲縮小を行う必要があります。三角関数は周期的であるため、引数を標準間隔まで減らす必要があります。まず、角度を 0 から 360 度の間に減らすことができます。しかし、いくつかの ID を使用することで、より少ない ID で済むことがわかります。0 ~ 45 度の角度のサインとコサインを計算すると、すべての角度のすべての三角関数を計算する方法をブートストラップできます。

引数を減らすと、ほとんどのチップはCORDICアルゴリズムを使用してサインとコサインを計算します。コンピュータはテイラー級数を使っていると言う人がいるかもしれません。それは理にかなっているように聞こえますが、そうではありません。CORDIC アルゴリズムは、効率的なハードウェア実装に適しています。(たとえば、三角関数をサポートしていないハードウェアでは、 ソフトウェアライブラリがテイラー級数を使用する場合があります。) CORDIC アルゴリズムを使用してかなり良い答えを得るが、精度を向上させるために別の処理を行うという追加の処理が行われる場合があります。

上記にはいくつかの改良点があります。たとえば、非常に小さな角度 theta (ラジアン単位) の場合、sin(theta) = theta がすべての精度で得られるため、他のアルゴリズムを使用するよりも単純に theta を返す方が効率的です。したがって、実際には、可能なすべてのパフォーマンスと精度を絞り出すために、多くの特殊なケースのロジックがあります。小規模な市場のチップは、最適化の取り組みがそれほど進んでいない可能性があります。

于 2008-12-05T20:59:17.403 に答える
48

編集: Jack Ganssle は、組み込みシステムに関する彼の著書"The Firmware Handbook"でまともな議論をしています。

参考までに: 精度とパフォーマンスの制約がある場合は、テイラー級数を数値目的の関数の近似に使用しないでください。(あなたの微積分のコースのために保存しておいてください。) それらは関数の単一点での解析性を利用します。たとえば、その点ですべての導関数が存在するという事実です。それらは必ずしも対象区間に収束するとは限りません。多くの場合、評価点のすぐ近くで「完全」になるために、関数近似の精度を分散するというお粗末な仕事をします。通常、エラーから離れるにつれて、エラーは上方にズームします。また、非連続導関数 (方形波、三角波、およびそれらの積分など) を含む関数がある場合、テイラー級数は間違った答えを返します。

最大次数 N の多項式を使用して区間 x0 < x < x1 にわたって特定の関数 f(x) を近似するときの最良の「簡単な」解決策は、チェビシェフ近似からのものです。良い議論については、数値レシピを参照してください。私がリンクした Wolfram 記事の Tj(x) と Tk(x) は、cos と逆余弦を使用していることに注意してください。これらは多項式であり、実際には再帰式を使用して係数を取得します。繰り返しますが、数値レシピを参照してください。

編集: ウィキペディアには、近似理論に関するややまともな記事があります。彼らが引用している情報源の 1 つ (ハート、「コンピューター近似」) は絶版です (そして中古のコピーは高価になる傾向があります) が、このようなものについて多くの詳細を説明しています. (Jack Ganssle は、彼のニュースレターThe Embedded Muse の第39 号でこれについて言及しています。)

編集 2: sin(x) に対する Taylor と Chebyshev の具体的なエラー メトリック (以下を参照) を次に示します。注意すべきいくつかの重要な点:

  1. 特定の範囲でのテイラー級数近似の最大誤差は、同程度のチェビシェフ近似の最大誤差よりもはるかに大きいことがわかります。(ほぼ同じエラーの場合、Chebyshev を使用すると項が 1 つ少なくて済むため、パフォーマンスが向上します)
  2. 範囲の縮小は大きな勝利です。これは、近似の間隔が小さくなると、高次多項式の寄与が小さくなるためです。
  3. 範囲の縮小を回避できない場合は、係数をより正確に保存する必要があります。

誤解しないでください: テイラー級数は正弦/余弦に対して適切に機能します (-pi/2 から +pi/2 の範囲では妥当な精度で)。技術的には、十分な項があれば、すべての実数入力に対して任意の精度に到達できます。ただし、テイラー級数を使用して cos(100) を計算しようとすると、任意精度の演算を使用しない限り実行できません)。非科学的な電卓を持って無人島に行き詰まり、サインとコサインを計算する必要がある場合、係数は覚えやすいので、おそらくテイラー級数を使用するでしょう。しかし、独自の sin() または cos() 関数を作成しなければならない現実世界のアプリケーションは非常にまれであるため、効率的な実装を使用して目的の精度に到達することをお勧めします (テイラー級数はそうではありません) 。

範囲 = -pi/2 ~ +pi/2、次数 5 (3 項)

  • Taylor: 4.5e-3 あたりの最大誤差、f(x) = xx 3 /6+x 5 /120
  • チェビシェフ: 7e-5 付近の最大誤差、f(x) = 0.9996949x-0.1656700x 3 +0.0075134x 5

範囲 = -pi/2 ~ +pi/2、次数 7 (4 項)

  • Taylor: 1.5e-4 あたりの最大誤差、f(x) = xx 3 /6+x 5 /120-x 7 /5040
  • チェビシェフ: 6e-7 付近の最大誤差、f(x) = 0.99999660x-0.16664824x 3 +0.00830629x 5 -0.00018363x 7

範囲 = -pi/4 ~ +pi/4、次数 3 (2 項)

  • Taylor: 2.5e-3 あたりの最大誤差、f(x) = xx 3 /6
  • チェビシェフ: 1.5e-4 あたりの最大誤差、f(x) = 0.999x-0.1603x 3

範囲 = -pi/4 ~ +pi/4、次数 5 (3 項)

  • テイラー: 3.5e-5 あたりの最大誤差、f(x) = xx 3 /6+x 5
  • チェビシェフ: 6e-7 付近の最大誤差、f(x) = 0.999995x-0.1666016x 3 +0.0081215x 5

範囲 = -pi/4 ~ +pi/4、次数 7 (4 項)

  • Taylor: 3e-7 あたりの最大誤差、f(x) = xx 3 /6+x 5 /120-x 7 /5040
  • チェビシェフ: 1.2e-9 付近の最大誤差、f(x) = 0.999999986x-0.166666367x 3 +0.008331584x 5 -0.000194621x 7
于 2008-12-27T00:39:00.610 に答える
14

Taylor SeriesまたはCORDICを使用して計算されていると思います。三角関数 (ゲーム、グラフィックス) を多用する一部のアプリケーションは、起動時に三角テーブルを構築するため、値を何度も再計算するのではなく、単に値を調べることができます。

于 2008-12-05T20:58:33.910 に答える
6

三角関数に関するウィキペディアの記事を確認してください。それらを実際にコードに実装することについて学ぶのに適した場所はNumerical Recipesです。

私はあまり数学に詳しくありませんが、sin、cos、および tan がどこから「来る」かについての私の理解は、ある意味で、直角三角形を扱っているときに観察されるということです。さまざまな直角三角形の辺の長さを測定し、その点をグラフにプロットすると、そこから sin、cos、および tan を求めることができます。Harper Shelby が指摘するように、関数は単純に直角三角形のプロパティとして定義されます。

これらの比率が円の幾何学にどのように関係しているかを理解することで、より高度な理解が得られます。これにより、ラジアンとそのすべての利点が導き出されます。ウィキペディアのエントリにすべて記載されています。

于 2008-12-05T21:03:52.433 に答える
-5

sin、cos、tan の物理的な説明が必要な場合は、それらが直角三角形とどのように関係しているかを考えてみてください。cos(ラムダ) の実際の数値は、角度の 1 つがラムダである直角三角形を形成し、ラムダに隣接する三角形の辺の長さを斜辺の長さで割ることによって求めることができます。同様に、sin については、斜辺で割った反対側を使用します。接線の場合は、反対側を隣接する側で割ったものを使用します。これを覚えておくための古典的なメモニックは、SOHCAHTOA (ソカトアと発音) です。

于 2009-01-29T06:09:26.677 に答える