アカウント名:
パスワード:
正しい値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桁目からおかしくなるのは、まあ、そーゆーもんではないかと。
これを回避するには角度のほうを正確に計算する必要があるかと思います。「度」の領域で正規化するとかですね。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
にわかな奴ほど語りたがる -- あるハッカー
そりゃ、まあ (スコア:1)
正しい値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!
Re:そりゃ、まあ (スコア:1)