質問いたします
浮動小数点で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
むぅ
意味不明スマソでした
何とか探し出しました
> 今回の目標はうまくデータを作成することにあり、
であれば、「浮動小数点型を使わない」のが一番でしょう。
たとえば、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コンパイル)の
違いによっても、誤差が変わってくることがあります。