通常のラジアンではなく度数で引数を取る三角関数を定義し、これらの引数に対して正しく丸められた結果を計算するにはどうすればよいでしょうか?
引数をM_PI/180.0
対応する関数にラジアンで渡す前に を掛けても、M_PI/180.0
は π/180 ではないため、機能しません。Handbook of Floating-Point Arithmetic のセクション 5.5 では、引数の正しく丸められた積を π/180 で計算する方法が提供されていますが、一部の引数では、この積が 2 つの連続する表現可能な浮動小数点数の中間点に近くなります。ラジアンで正しく丸められた関数でさえ、間違った最終結果を生成する可能性があります。
単独または組み合わせて機能する可能性のある 2 つの戦略は、より高い精度を使用することsinpi
と、CRlibmcospi
のtanpi
三角関数を使用して、それぞれとを計算することです。sin(πx)
cos(πx)
tan(πx)
後者の戦略では、180 で割るという問題が残りますが、これは多くの議論にとって正確ではありません。
高精度の戦略 (引数に π/180 の拡張精度表現を掛けてから、拡張精度関数をラジアンで適用する) に関しては、「正確な」ケースで問題が残る可能性があります。との唯一の有理結果はsin
で得られるという定理は、ラジアン バージョンにのみ適用されます。これは明らかに次数バージョンには適用されません。浮動小数点入力 x について、sindeg(x) が 2 つの連続する表現可能な浮動小数点数の正確な中間点である場合、最終的な結果を保証するのに十分な中間精度はありません。結果は正しく丸められます。cos
tan
0