- 921 名前:98
いやその話じゃない。FSIN,FCOSの誤差の話は、 Intelは 1.0ulp 誤差だと言っているのにそうなってない、という話。 (とは言え仮数部が10bit多いのだが) 君が言っているのは数学的なものとだろ? それは浮動小数点では誤差があるのが仕様。 > floorで切り捨てているから、52+1=53 になるはずなのに、54になる! これは間違い。以下。 Math.floor(Math.log2(Math.pow(2,53)-1))+1 // 54で正しい。 Math.log2(Math.pow(2,53)-1) は、52よりも53に限りなく近いから、53になる。 > これは、除数・被除数ともに誤差があるから、時々おかしくなる これも上記の通り、認識間違い。 Math.LN2はそもそも「浮動小数点的には」誤差がない。 というより計算済みの値が使われる(はず) Math.log2(x)等の関数は一般的に割り算での実装はされないはず。 理由は以下。 ・割り算は誤差が出やすい(多分テーラー展開式等が使われる) ・割り算は遅い ・そもそも固定値割り算は逆数の掛け算に変更される (とはいえ、現実的にはこの方法は割り算よりも誤差が出たりするが) だから、 > Math.log2(x) = Math.log(x) / Math.LN2 が成立しない時も、それは浮動小数点計算による誤差であり、仕様。 [] - [ここ壊れてます]
|

|