パスワードを忘れた? アカウント作成
495068 journal

tarosukeの日記: cosをテンプレートで 2

日記 by tarosuke

long doubleで計算してもcos1°とcos179°が18桁くらいしか合わないなぁ...。nの範囲が32でも256でも40桁全部同じ値になることを考えるとちょっと不満だ。何にしても角度の範囲が極端に大きくなければnが増えると急激に収束するので加算誤差と言うのもちょっと考えにくい。どういうことだろうか。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by tt (2867) on 2007年05月10日 3時01分 (#1154986) 日記
    179度は1度に比べて絶対値が2^7ほど大きいので、浮動小数点の精度が6bitか7bit下がってしまいます。つまり角度の誤差が増えてしまいます。

    正しい値x(|x|は非常に小さいとする)に対するcos(x)と、誤差Eを含むx+Eに対するcos(x+E)のずれは以下のように評価できます。

    0近傍のcos xを1-x^2で近似することで、cos(x)とcos(x+E)の差は2Eと近似できます。よって、cos(x)とcos(x+E)の相対誤差は2E/(1-x^2)~2E(xがほぼ0なので)と近似されます。つまりxの誤差(E)が6~7bitだと、cos(x)の誤差は7~8bitとなります。

    x86環境だと仮定すると、通常long doubleはmantissa 64bit(+ケチビット1)ですので、65bit中の下位7~8bitぐらいは誤差ということになり、正しいのは65-7=58bit=10進数で17.458桁ぐらいとなります。

    そんなわけで、18桁目からおかしくなるのは、まあ、そーゆーもんではないかと。

    これを回避するには角度のほうを正確に計算する必要があるかと思います。「度」の領域で正規化するとかですね。

    --
    -- Takehiro TOMINAGA // may the source be with you!
typodupeerror

人生unstable -- あるハッカー

読み込み中...