0

奇妙な動作をしているコードがあり、2 つのdouble値を加算した結果を丸めているようです。これは私のコードで問題を引き起こしています。

残念ながら、この問題を修正することはできません。なぜなら、私のユニット テスト環境は正常に動作しており (丸められていません)、アプリケーションは正常ではありません (丸められています)。

私のテスト環境では:

a = -3.7468700408935547
b = 525218.0
c = b + a
c = 525214.25312995911

私のアプリケーション内:

a = -3.7468700408935547
b = 525218.0
c = b + a
c = 525214.25

何が原因でしょうか? プロジェクト構成?(私はビジュアルスタジオを使用しています、ところで)

編集 (コメントから)
Visual Studio デバッガーを使用して同じコードをステップ実行しているため、まったく同じコードです。

もっとコードがありますが、問題をその特定の合計に絞り込みました。

各値のバイナリ表現は次のとおりです。

テスト環境:

System.BitConverter.ToString(System.BitConverter.GetBytes(a))   "00-00-00-00-97-F9-0D-C0"   string
System.BitConverter.ToString(System.BitConverter.GetBytes(b))   "00-00-00-00-44-07-20-41"   string
System.BitConverter.ToString(System.BitConverter.GetBytes(c))   "00-40-9A-81-3C-07-20-41"   string

アプリケーション内:

System.BitConverter.ToString(System.BitConverter.GetBytes(a))   "00-00-00-00-97-F9-0D-C0"   string
System.BitConverter.ToString(System.BitConverter.GetBytes(b))   "00-00-00-00-44-07-20-41"   string
System.BitConverter.ToString(System.BitConverter.GetBytes(c))   "00-00-00-80-3C-07-20-41"   string

編集2:

Alexei Levenkov が指摘しているように、この問題は FPU 構成を変更するライブラリによって引き起こされます。

これが私にとって何を意味するのか知りたい人のために: 入力値についていくつかの仮定を立て、いくつかのプリエンプティブな値の丸めを行うことで、特定のコードでこの問題を軽減することができました。これにより、計算が一貫したものになりました。

4

2 に答える 2

1

財務計算で必要とされるような精度が必要な場合は、10 進数を使用します。

編集 参照:

于 2012-10-30T16:45:02.980 に答える
1

あなたのアプリケーションは、FPU の設定で奇妙なことをしているかもしれません。つまり、精度を再構成する数学用のランダムライブラリを使用しています...

Direct3d が疑わしい可能性があります。たとえば、 double の Pow 実装を参照してください。

于 2012-10-30T17:28:39.983 に答える