ルックアップ テーブルを利用する正弦関数の基本的な固定小数点の変形を作成しました (FPU なしの AVR マイクロ コントローラーをターゲットにしています)。私の実装は、 math.hの浮動小数点ペンダントのように、負の値と 2π を超える値も受け入れます。
したがって、指定された値を 0 ~ 2π の範囲 (つまり、対応する固定小数点) にマップする必要があります。正の引数の場合、C の組み込み剰余演算子%を使用して簡単にトリムできます。これは負の値のオプションではないため、次の (明白な) アプローチを使用しています。
unsigned int modulus = (a - (INT_FLOOR(a / b) * b) + b) % b;
aとbは整数型の値であり、INT_FLOOR() は (a/b) の小数部分が切り捨てられるというヒントとしてのみ使用されます。この式は、計算されたモジュラス (テーブル配列のインデックスとして使用される) が常に正であること、および負の引数も対応する正の値にマップされることを保証します (両方向の位相シフトを維持します)。
このアプローチに関する私の問題は、5 つ以上の算術演算が含まれるため、過度に複雑に見えることです。私が見逃しているより効率的なアプローチはありますか?