Пытаясь портировать Java-код на C ++, я наткнулся на странное поведение. Я не могу получить двойное добавление к работе (даже если в Visual Studio 2008 установлена опция компилятора / fp: strict, что означает «правильную» математику с плавающей точкой).
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 */
В другом тестовом проекте, который я настроил, он работает нормально (/ fp: строгое поведение в соответствии с IEEE754).
Использование Visual Studio 2008 (стандарт) без оптимизации и FP: строго.
Есть идеи? Это действительно усекает до поплавков? Этот проект действительно требует одинакового поведения на стороне Java и C ++. Я получил все значения, читая из окна отладки в VC ++.
Решение: _fpreset (); // Идея Барри Келли решила это. Библиотека устанавливает низкую точность FP.