Включение строгого режима с плавающей запятой в GCC
Я еще не создал программу, чтобы узнать, будет ли она нужна GCC. Когда я это сделаю, я хотел бы знать, как бы я включил режим строгой плавающей запятой, который позволит воспроизводить результаты между прогонами и компьютерами, Спасибо.
Ответы
Ответ 1
Компиляция с -msse2
на процессоре Intel/AMD, который поддерживает его, доставит вас почти туда. Не позволяйте библиотеке помещать FPU в режим FTZ/DNZ, и вы будете в основном настроены (несмотря на ошибки процессора).
Для других архитектур ответ будет другим. Те архитектуры, которые не предлагают удобный способ получить точную семантику IEEE 754 (например, процессоры pre-SSE2 IA32), потребуют использования библиотеки эмуляции с плавающей запятой для получения желаемого результата с очень высокой эффективностью.
Если ваша целевая архитектура поддерживает инструкцию fmadd
(умножение и добавление без промежуточного округления), убедитесь, что ваш компилятор не использует ее, когда у вас есть явные умножения и дополнения в исходном коде. GCC не должен делать это, если вы не используете опцию -ffast-math.
Ответ 2
Если вы используете -ffloat-store
и всегда сохраняете промежуточные значения для переменных или применяете (явные) приведения к желаемому типу/точности, вы должны быть не менее 90% от своей цели и, возможно, больше. Я бы приветствовал комментарии о том, есть ли случаи, когда этот подход все еще не хватает. Обратите внимание, что я утверждаю, что это работает даже без SSE-опций.
Ответ 3
Вы также можете использовать опцию GCC
-mpc64
на i386/ia32 target, чтобы заставить вычисление с двойной точностью даже на x87 FPU. См. Руководство GCC.
Вы также можете изменить поведение FPU x87 во время выполнения, см. Детерминированная кросс-платформенная арифметика с плавающей точкой, а также Введение в GCC.