1. ホーム
  2. algorithm

[解決済み] 三角関数の仕組み [クローズド]

2022-11-10 14:07:27

質問

高校の数学で、そしておそらく大学でも、三角関数の使い方、三角関数が何をするのか、三角関数がどんな問題を解決するのかを教わるわけです。しかし、それらは常にブラックボックスとして提示されてきました。何かのサインやコサインが必要な場合、電卓のサインやコスのボタンを押せば、それで完了です。それはそれでいいのですが。

私が不思議に思うのは、三角関数が一般的にどのように実装されているかということです。

どのように解くのですか?

まず、ある種の範囲の縮小を行う必要があります。 三角関数は周期的なものなので、引数を標準的な間隔に縮小する必要があります。 手始めに、角度を 0 度から 360 度の間に縮小することができます。しかし、いくつかの恒等式を使うことで、もっと少ない値で済むことに気づきます。 0度から45度の間の角度のサインとコサインを計算すれば、すべての角度のすべての三角関数を計算する方法をブートストラップすることができます。

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

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