-ffast-math
делает намного больше, чем просто нарушает строгое соответствие IEEE.
Прежде всего, конечно, это нарушает строгое соответствие IEEE, позволяя, например, переупорядочивать инструкции к чему-то, что математически совпадает (в идеале), но не точно то же самое с плавающей запятой.
Во-вторых, он отключает настройку errno
после математических функций с одной инструкцией, что означает избегание записи в локальную переменную потока (это может иметь 100% -ное различие для этих функций на некоторых архитектурах).
В-третьих, он предполагает, что вся математика является конечной , что означает, что никакие проверки на NaN (или ноль) не производятся там, где они будут иметь вредные эффекты. Просто предполагается, что этого не произойдет.
В-четвертых, это позволяет использовать взаимные аппроксимации для деления и обратного квадратного корня.
Кроме того, он отключает знаковый ноль (код предполагает, что нулевой знак не существует, даже если цель его поддерживает) и математика округления, что позволяет, среди прочего, выполнять постоянное свертывание во время компиляции.
Наконец, он генерирует код, который предполагает, что никакие аппаратные прерывания не могут произойти из-за математики сигнализации / перехвата (то есть, если они не могут быть отключены на целевой архитектуре и, следовательно , произойдут , они не будут обрабатываться).