JavaコードをC++に移植しようとしました。私は奇妙な動作を見つけました。私は(たとえコンパイラオプション/ fp:strictがVisual Studio 2008で浮動小数点数の計算が正しいことを意味していても)2倍の加算を得ることはできません。 (:IEEE754によると、厳密な振る舞い/ FP)異なるテストプロジェクトで 特定のVisual Studio 2008プロジェクトでダブルスが正しく追加されないのはなぜですか?
double a = 0.4;
/* a: 0.40000000000000002, correct */
double b = 0.0 + 0.4;
/* b: 0.40000000596046448, incorrect
(0 + 0.4 is the same). It's not even close to correct. */
double c = 0;
float f = 0.4f;
c += f;
/* c: 0.40000000596046448 too */
は、私はそれがうまく動作します設定します。
Visual Studio 2008(標準)を最適化なしで使用し、FP:strictを使用します。
アイデア?それは本当に浮動小数点に切り捨てられますか?このプロジェクトは、JavaとC++の両方で同じ動作が必要です。私はVC++のデバッグウィンドウから読み込んですべての値を得ました。
ソリューション: _fpreset(); // Barry Kellyの考えはそれを解決しました。ライブラリがFP精度を低く設定していました。
コンパイルに使用した正確なコマンドラインとともに小さな完全なテストプログラムを投稿できますか(出力ウィンドウなどを参照)、これは問題を示していますか?私が再現できる唯一の方法は、代わりに0.0f + 0.4fを使うことです。 –
浮動小数点型の不正確さを認識していると思いますか?小数点第7位まで正確であることは、通常、デフォルトの印刷精度が6 @ –
@エヴァンであるため、大丈夫とみなされます。彼の例は、浮動小数点の不正確さによって説明される以上のものです。 – Kevin