-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).
double
, pero varía según la aplicación). Una cosa a tener en cuenta es que las optimizaciones de matemáticas rápidas no necesariamente agregan "más" redondeo. La única razón por la que no cumple con IEEE es porque la respuesta es diferente (aunque ligeramente) de lo que está escrito.x
es menor que 10, el error en el ejemplo de Mystical disminuirá alrededor de 10 ^ -10. Pero six = 10e20
, es probable que el error sea de muchos millones.-fassociative-math
lo que está incluido en-funsafe-math-optimizations
la cual a su vez está habilitado con-ffast-math
¿Por qué no optimizar el CCGa*a*a*a*a*a
a(a*a*a)*(a*a*a)
?