2011-07-30 4 views
0

は、私は同じPC上の2つの異なるプロジェクトに次のコードを持っている:1.15-1.31 = 0.01999998または0.02?

Dim MySingle1 As Single = 1.15 
Dim MySingle2 As Single = 1.13 
Dim MyResult As Single = MySingle1 - MySingle2 

しかし、最も興味深いのは、一つのプロジェクトにMyResultは0.02であり、他のプロジェクトでMyResultが0.01999998である、です。

私はこれを解決できませんでした。私に提案してください。

ありがとうございます。

よろしく SKPaul

+0

「MyResult」の値も、どちらの場合もまったく同じ方法でチェックしましたか? '0.01999998'はより正確な値のように見えるので、他のケースでは精度が失われているように見えます。 –

+0

Mattiに感謝、両方のケースですべてが同じです。デバッグモードでチェックしています。 –

+0

他の番号を確認しましたか?例えば、1つのプロジェクトで1/3が0.33、別のプロジェクトで0.33333333であるかどうかを確認しますか?値を切り上げる設定をいくつか変更する必要があります。 ps 0.01999998はバイナリ数学を使って得られるべき値です。0.02は切り上げられます。 – QuentinUK

答えて

3

What Every Computer Scientist Should Know About Floating-Point Arithmetic

話を短くするために、コンピュータが正確に、ほとんどの浮動小数点数を表すことができません。彼らは近似に取り組んでいます。

+0

これは、同じ環境でまったく同じ手順を(おそらく)実行すると、異なる結果が生じる理由を説明していません。浮動小数点数は不正確ですが、不正確さは予測可能です。 –

+0

@マッティ - これはよくある誤解です。リリースビルドのジッタオプティマイザは、32ビットマシンでは予測できませんが、FPUレジスタに格納された中間結果を80ビット精度で残すことができます。 64ビットジッタには問題ありません。単精度浮動小数点型の計算では有効数字はわずか6.5桁ですが、残りはノイズだけです。 –

+0

@ハンス:男は彼がデバッガを使っていたと言った。そのような最適化は、デバッグビルドで始めるべきではないでしょうか? –

0

浮動小数点は、内部で2進表現を使用します。単精度の場合は24ビットで、精度の〜(6,7)桁の数字にほぼ相当します(これは7桁目が不正確です)。

+0

どうすればいいですか? MyResult.Tosting( "0.00")?または他の方法? –

関連する問題