web-dev-qa-db-ja.com

Sin関数をより迅速かつ正確に計算する方法は?

y(n)=32677Sin(45/1024•n)を計算したいのですが、yは整数で、nの範囲は0〜2048です。このプロセスをより迅速かつ正確に行うにはどうすればよいですか?ここで、参照回答をお見せしたいと思います。Sin(a+b)=Sin(a)Cos(b)+Cos(a)Sin(b)およびCos(a+b)=Cos(a)Cos(b)-Sin(a)Cos(b)からです。したがって、Sin(45/1024•1)Cos(45/1024•1)のみを保存できます。次に、次の式を使用します。

Sin(45/1024•2)=Sin(45/1024•1+45/1024•1)Cos(45/1024•2)=Cos(45/1024•1+45/1024•1)Sin(45/1024•n)=Sin(45/1024•(n-1)+45/1024•1)Cos(45/1024•n)=Cos(45/1024•(n-1)+45/1024•1)、この方法は、大きな配列を格納せずに高速化できます。

8
LaiJong

nの範囲が0〜2048の場合、値を事前に計算して、配列に格納できます。 y(n)values[n]になります。

18
vartec

実行時ではなくコンパイル時にテーブルを計算します。

あなたは、16ビットのスケーリングされた整数値の2048要素のテーブルを実行しています。

安価なMatlabスクリプトを作成し、最終的なプログラミング言語に適したデータ行を提供する印刷物を作成します。結果を定数データテーブルとしてソースコードにカットアンドペーストし、実行時にテーブルルックアップを実行します。これにより、プログラムの起動時間ではなく、初期計算時間がビルドサイクルに組み込まれます。

1
John R. Strohm

関数の形式を考えると、自然な答えは CORDICアルゴリズム です。これは、質問の内訳よりもはるかにクリーンなアプローチです。一方、必要なテーブルは、他の人が提案したテーブルよりもはるかに小さくなっています。

1
MSalters