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