-ffast-math
hace mucho más que simplemente romper el estricto cumplimiento de IEEE.
En primer lugar, por supuesto, rompe el estricto cumplimiento de IEEE, lo que permite, por ejemplo, reordenar las instrucciones a algo que sea matemáticamente igual (idealmente) pero no exactamente igual en coma flotante.
En segundo lugar, deshabilita la configuración errno
después de las funciones matemáticas de una sola instrucción, lo que significa evitar escribir en una variable local de hilo (esto puede hacer una diferencia del 100% para esas funciones en algunas arquitecturas).
En tercer lugar, supone que todas las matemáticas son finitas , lo que significa que no se realizan comprobaciones de NaN (o cero) en el lugar donde tendrían efectos perjudiciales. Simplemente se supone que esto no va a suceder.
Cuarto, permite aproximaciones recíprocas para la división y la raíz cuadrada recíproca.
Además, deshabilita el cero con signo (el código supone que el cero con signo no existe, incluso si el objetivo lo admite) y el redondeo matemático, lo que permite, entre otras cosas, el plegado constante en tiempo de compilación.
Por último, se genera un código que asume que no hay interrupciones de hardware pueden ocurrir debido a la señalización / atrapando matemáticas (es decir, si estos no se puede desactivar en la arquitectura de destino y por lo tanto no suceda , no van a ser manejados).