Почему дубликаты добавляются неправильно в конкретном проекте Visual Studio 2008? - PullRequest
5 голосов
/ 20 июля 2009

Пытаясь портировать 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.

Ответы [ 2 ]

8 голосов
/ 20 июля 2009

Единственное, о чем я могу подумать, возможно, вы связываетесь с библиотекой или библиотекой DLL, которая изменила точность процессора с помощью управляющего слова.

Вы пытались вызвать _fpreset() из float.h до проблемных вычислений?

3 голосов
/ 20 июля 2009

Да, это, безусловно, усекает до числа с плавающей точкой. Я получаю то же значение печати float f = 0.4, что и вы в «неточном» случае. Попробуйте:

double b = 0.0 + (double) 0.4;

Тогда возникает вопрос: почему оно усекается до числа с плавающей точкой? В стандарте нет оправдания трактовать 0.0 + 0.4 как выражение одинарной точности, поскольку литералы с плавающей запятой имеют двойную точность, если у них нет суффикса, чтобы сказать иначе.

Так что, должно быть, что-то мешает вашим настройкам, но я понятия не имею, что.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...