浮動小数点で誤差発生のデータを作成するには?

解決


はづき  2004-07-29 21:42:29  No: 115167

質問いたします
浮動小数点でFIX関数を使い誤差
これはわかっているつもりなのですが

逆に誤差がどのようなデータで発生するのかを調べたいのです
FIX(A / B * C)
の式を用いたいと思います(ABCはいずれもdouble型)

一応自分なり解釈ですと
よく出てくる例で32 / 1000 * 1000 = 31
0.032は0.031999999・・・となり微妙に32に足らなくなるため
起こると認識はしています

そこで、ある整数値Xを1000で割り(これをY)、
Xから1000回Yを引けば0より大きいか小さいかで見つけられると思ったのですが
うまく見つけられず・・・

また32/1000*1000は31なのに
320/10000*10000は320になることにも何か納得できません
(CPU等にも依存するそうですが・・・)

今回の目標はうまくデータを作成することにあり、
納得することではないのですが
何かうまくデータを作成する方法等ございましたらご教授願います

WINDOWS2000 Pro
VisualBasic5.0 SP5


はづき  2004-07-30 02:12:29  No: 115168

むぅ
意味不明スマソでした
何とか探し出しました


魔界の仮面弁士  2004-07-30 02:43:38  No: 115169

> 今回の目標はうまくデータを作成することにあり、
であれば、「浮動小数点型を使わない」のが一番でしょう。
たとえば、Currencyを使うとか。

> 逆に誤差がどのようなデータで発生するのかを調べたいのです
厳密に定義すると大変ですが、大まかに言えば、
「循環小数」の場合に発生すると思えば良いかと思います。

10進数で、「10÷3」を正しく表現できないのと同様、
2進数でも、表現しきれない数値と言うものが存在します。
(桁数を無限に持てれば表現できますが、コンピュータのメモリは有限ですしね)

たとえば、0.5、0.125、0.375 等は2進数でも現せますが、
0.05 だと、無限小数になってしまいます。

今回の0.032の場合も、2進数で表そうとすれば、
  0.03125000000000000000 = 2^-5 
  0.03173828125000000000 = 2^-5 + 2^-11
  0.03198242187500000000 = 2^-5 + 2^-11 + 2^-12
  0.03199768066406250000 = 2^-5 + 2^-11 + 2^-12 + 2^-16
  0.03199958801269530000 = 2^-5 + 2^-11 + 2^-12 + 2^-16 + 2^-19
      :
      :
のようになりますので、有限の桁数で表現すると、0.32 よりも
微妙に小さな値になります。

> (CPU等にも依存するそうですが・・・)
さらにいうと、コンパイルモード(ネイティブコンパイル/P-Codeコンパイル)の
違いによっても、誤差が変わってくることがあります。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加