Другое математическое поведение округления между Linux, Mac OS X и Windows

Привет,

Я разработал, некоторые смешали код C/C++ с некоторыми интенсивными числовыми вычислениями. При компиляции в Linux и Mac OS X я получаю очень похожие результаты после того, как моделирование заканчивается. В Windows программа компилирует также, но я получаю совсем другие результаты, и иногда программа, кажется, не работает.

Я использовал компиляторы GNU во всех системах. Некоторый друг рекомендует мне добавить - frounding-математика, и теперь версия для Windows, кажется, работает более стабильная, но Linux и OS X, их результаты, не изменяются вообще.

Вы могли рекомендовать другому опции получить больше соответствия между версиями Win и Linux/OSX?

Спасибо

P.D. Я также попробовал-O0 (никакая оптимизация) и указал-m32

7
задан asdf 25 December 2009 в 16:26
поделиться

3 ответа

Я не могу говорить о реализации в Windows, но чипы Intel содержат 80-битные регистры с плавающей запятой и могут обеспечивать более высокую точность, чем указанная в стандарте с плавающей запятой IEEE-754. Вы можете попробовать вызвать эту процедуру в main () вашего приложения (на платформах микросхем Intel):

inline void fpu_round_to_IEEE_double()
{
   unsigned short cw = 0;
   _FPU_GETCW(cw);        // Get the FPU control word
   cw &= ~_FPU_EXTENDED;  // mask out '80-bit' register precision
   cw |= _FPU_DOUBLE;     // Mask in '64-bit' register precision
   _FPU_SETCW(cw);        // Set the FPU control word
}

Я думаю , что это отличается от режимов округления, обсуждаемых @Alok.

10
ответ дан 6 December 2019 в 09:20
поделиться

Существует четыре различных типа округления для чисел с плавающей запятой: округление в сторону ноль, округлить вверх, вниз и до ближайшего числа. В зависимости от компилятора / операционной системы значение по умолчанию может отличаться в разных системах. Для программного изменения метода округления см. fesetround . Он указан стандартом C99, но может быть доступен вам.

Вы также можете попробовать опцию -ffloat-store gcc. Это попытается помешать gcc использовать 80-битные значения с плавающей запятой в регистрах.

Кроме того, если ваши результаты меняются в зависимости от метода округления и различия значительны, это означает, что ваши расчеты могут быть нестабильными. Пожалуйста, подумайте о проведении интервального анализа, или используя какой-либо другой метод, чтобы найти проблему. Для получения дополнительной информации см. Насколько бесполезны бессмысленные оценки округления в вычислениях с плавающей запятой? (pdf) и Подводные камни проверки вычислений с плавающей запятой (ссылка ACM, но вы можете получить PDF из многих мест, если это не сработает для вас).

9
ответ дан 6 December 2019 в 09:20
поделиться

В дополнение к упомянутым выше параметрам округления времени выполнения, вы можете управлять параметрами компилятора Visual Studio в меню «Свойства»> «C ++»> «Создание кода»> «Модель с плавающей запятой». Я встречал случаи, когда установка этого параметра на «Быстрый» могла приводить к некорректному числовому поведению (например, итерационные методы не сходились).

Параметры объясняются здесь: вы можете управлять настройками компилятора Visual Studio в разделе «Свойства»> «C ++»> «Создание кода»> «Модель с плавающей запятой». Я встречал случаи, когда установка этого параметра на «Быстрый» могла приводить к некорректному числовому поведению (например, итерационные методы не сходились).

Параметры объясняются здесь: вы можете управлять настройками компилятора Visual Studio в разделе «Свойства»> «C ++»> «Создание кода»> «Модель с плавающей запятой». Я встречал случаи, когда установка этого параметра на «Быстрый» может приводить к некорректному числовому поведению (например, итерационные методы не сходятся).

Параметры объясняются здесь: http://msdn.microsoft.com/en-us/library/e7s85ffb%28VS.80%29.aspx

1
ответ дан 6 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: