javaで正弦関数と余弦関数をある程度の精度で計算するには?
標準sin
のためcos
、それを行うことはできません。
Taylor 展開 (より正確には、x=0 について Taylor である Maclauren 展開) は、この計算を行うのに適した方法ではありません。ほとんどのコンピューターはCORDIC アルゴリズムを使用します。CORDIC アルゴリズムには、有限回数の反復で任意の精度に収束し、非常に単純な計算しか必要としないという利点があります。
心に留めておくべきもう 1 つのこと: パラメータを [0 pi/2] の範囲に正確に縮小する方法から始めたいと考えており、x
単純なロジックを使用して答えの符号を処理します。x が大きくなると、マクローレン (テイラー) 展開は非常に長い時間振動します。
これは、とりわけ、pi
少なくとも目的の答えの桁数に加えて、さらに削減する必要がある桁数の値を知る必要があることを意味しますx
(x = 1000000 の場合、さらに 6 桁の pi が必要になるため)縮小されたドメインで十分な精度で答えを得るだけです)。
最終的に、計算の精度よりも結果の精度の桁数が少なくなります。上記のソースによると、64 ビットの倍数では、アルゴリズムの 48 回の反復で精度が向上します (2^48 精度で約 1)。double の仮数は 53 ビットであるため、実際にはそれほど悪くはありません (計算で使用される精度の 5 ビット以内)。
アルゴリズムの Java 実装は、この以前の回答にあります。テイラー展開と比べてみるのも面白いだろう...
この論文を編集して、CORDIS と Taylor の展開の収束を比較し、削減されたドメインで作業している場合 (x を [0 pi/2] にした後)、Taylor の方が高速であると結論付けています。また、多くの丸め誤差を回避するかなり巧妙な再定式化があり、項の強引な評価よりも正確になります。
sinとcosのテイラー級数展開を使用して、それらを任意の精度で計算できます。