Привет,
Я разработал, некоторые смешали код C/C++ с некоторыми интенсивными числовыми вычислениями. При компиляции в Linux и Mac OS X я получаю очень похожие результаты после того, как моделирование заканчивается. В Windows программа компилирует также, но я получаю совсем другие результаты, и иногда программа, кажется, не работает.
Я использовал компиляторы GNU во всех системах. Некоторый друг рекомендует мне добавить - frounding-математика, и теперь версия для Windows, кажется, работает более стабильная, но Linux и OS X, их результаты, не изменяются вообще.
Вы могли рекомендовать другому опции получить больше соответствия между версиями Win и Linux/OSX?
Спасибо
P.D. Я также попробовал-O0 (никакая оптимизация) и указал-m32
Я не могу говорить о реализации в 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.
Существует четыре различных типа округления для чисел с плавающей запятой: округление в сторону ноль, округлить вверх, вниз и до ближайшего числа. В зависимости от компилятора / операционной системы значение по умолчанию может отличаться в разных системах. Для программного изменения метода округления см. fesetround
. Он указан стандартом C99, но может быть доступен вам.
Вы также можете попробовать опцию -ffloat-store
gcc. Это попытается помешать gcc использовать 80-битные значения с плавающей запятой в регистрах.
Кроме того, если ваши результаты меняются в зависимости от метода округления и различия значительны, это означает, что ваши расчеты могут быть нестабильными. Пожалуйста, подумайте о проведении интервального анализа, или используя какой-либо другой метод, чтобы найти проблему. Для получения дополнительной информации см. Насколько бесполезны бессмысленные оценки округления в вычислениях с плавающей запятой? (pdf) и Подводные камни проверки вычислений с плавающей запятой (ссылка ACM, но вы можете получить PDF из многих мест, если это не сработает для вас).
В дополнение к упомянутым выше параметрам округления времени выполнения, вы можете управлять параметрами компилятора Visual Studio в меню «Свойства»> «C ++»> «Создание кода»> «Модель с плавающей запятой». Я встречал случаи, когда установка этого параметра на «Быстрый» могла приводить к некорректному числовому поведению (например, итерационные методы не сходились).
Параметры объясняются здесь: вы можете управлять настройками компилятора Visual Studio в разделе «Свойства»> «C ++»> «Создание кода»> «Модель с плавающей запятой». Я встречал случаи, когда установка этого параметра на «Быстрый» могла приводить к некорректному числовому поведению (например, итерационные методы не сходились).
Параметры объясняются здесь: вы можете управлять настройками компилятора Visual Studio в разделе «Свойства»> «C ++»> «Создание кода»> «Модель с плавающей запятой». Я встречал случаи, когда установка этого параметра на «Быстрый» может приводить к некорректному числовому поведению (например, итерационные методы не сходятся).
Параметры объясняются здесь: http://msdn.microsoft.com/en-us/library/e7s85ffb%28VS.80%29.aspx