のような三角関数に関してはsin()
、5 年後、高品質の三角関数の重要な側面である範囲削減については言及されていcos()
ません。tan()
これらの関数の初期段階では、角度をラジアン単位で 2*π 間隔の範囲に減らします。x = remainder(x, 2*M_PI)
しかし、π は不合理なので、誤差を導入するなどの単純な削減M_PI
、またはマシン pi は π の近似値です。それで、どうすればいいx = remainder(x, 2*π)
ですか?
初期のライブラリは、拡張された精度または細工されたプログラミングを使用して高品質の結果を提供しましたが、それでも範囲は限られていましたdouble
。のように大きな値が要求された場合sin(pow(2,30))
、結果は無意味であるか0.0
、または精度の完全な損失または精度の部分的な損失のようなエラー フラグが設定されていた可能性があります。TLOSS
PLOSS
-π から π のような間隔への大きな値の適切な範囲縮小は、 のような基本的な三角関数sin()
自体の課題に匹敵する挑戦的な問題です。
優れたレポートは、巨大な引数の引数削減: 最後のビットまで有効(1992) です。問題を十分にカバーしています。必要性と、さまざまなプラットフォーム (SPARC、PC、HP、その他 30 以上) での状況について説明し、からまでのすべて に対して質の高い結果を提供するソリューション アルゴリズムを提供します。double
-DBL_MAX
DBL_MAX
元の引数が度単位であるが、大きな値である可能性がある場合は、fmod()
精度を向上させるために first を使用します。良いものはエラーfmod()
を導入しないため、優れた範囲削減を提供します。
// sin(degrees2radians(x))
sin(degrees2radians(fmod(x, 360.0))); // -360.0 < fmod(x,360) < +360.0
さまざまなトリガー ID があり、remquo()
さらに改善されます。サンプル: sind()