それはあなたが必要とする精度に依存します。sinの最大導関数は1であるため、x1とx2が互いにイプシロン内にある場合、sin(x1)とsin(x2)もイプシロン内にあります。たとえば0.001以内の精度が必要な場合は、1000 * PI = 3142ポイントのルックアップテーブルを作成し、必要な値に最も近い値をルックアップできます。ネイティブコードは(おそらく)多項式係数のルックアップテーブルを使用してから補間するため、またこのテーブルはキャッシュに簡単にとどまることができるほど小さいため、これはネイティブコードよりも高速になる可能性があります。
全範囲で完全な精度が必要な場合は、おそらくこれ以上のことはできません。
必要に応じて、(1 / sin(x))を介してルックアップテーブルを作成することもできます。これは、実際に関心のある関数だからです。いずれにせよ、sin(x)の小さなエラーが1 / sin(x)の大きなエラーを引き起こす可能性があるため、sin(x)=0の周りに注意する必要があります。エラー許容度を定義することは、どのショートカットを使用できるかを理解するために重要です。
次のようなルックアップテーブルを作成します。
float *table = malloc(1000 * sizeof(float));
for(int i = 0; i < 1000; i++){
table[i] = sin(i/1000.0);
}
それにアクセスするようなもの
float fastSin(float x){
int index = x * 1000.0;
return table[index];
}
このコードは完全ではありませんが(配列の境界のため、0 <x <1以外ではクラッシュします)、開始する必要があります。