-ffast-math
faz muito mais do que apenas quebrar a conformidade estrita com o IEEE.
Antes de tudo, é claro, ele quebra a estrita conformidade com o IEEE, permitindo, por exemplo, reordenar as instruções para algo que é matematicamente o mesmo (idealmente), mas não exatamente o mesmo no ponto flutuante.
Segundo, desabilita a configuração errno
após funções matemáticas de instrução única, o que significa evitar a gravação em uma variável local de encadeamento (isso pode fazer uma diferença de 100% para essas funções em algumas arquiteturas).
Terceiro, assume-se que toda a matemática é finita , o que significa que nenhuma verificação de NaN (ou zero) é feita no lugar onde eles teriam efeitos prejudiciais. Supõe-se simplesmente que isso não vai acontecer.
Quarto, permite aproximações recíprocas para divisão e raiz quadrada recíproca.
Além disso, ele desativa o zero assinado (o código assume que o zero assinado não existe, mesmo que o destino o suporte) e a matemática de arredondamento, que permite, entre outras coisas, dobrar constantemente no tempo de compilação.
Por fim, gera código que pressupõe que nenhuma interrupção de hardware possa ocorrer devido à matemática de sinalização / interceptação (ou seja, se elas não puderem ser desabilitadas na arquitetura de destino e, consequentemente , acontecerem , elas não serão tratadas).