-ffast-math
fa molto di più di una semplice violazione della rigorosa conformità IEEE.
Prima di tutto, ovviamente, infrange la rigida conformità IEEE, consentendo ad esempio il riordino delle istruzioni su qualcosa che è matematicamente lo stesso (idealmente) ma non esattamente lo stesso in virgola mobile.
In secondo luogo, disabilita l' impostazione errno
dopo le funzioni matematiche a istruzione singola, il che significa evitare una scrittura su una variabile thread-local (questo può fare una differenza del 100% per quelle funzioni su alcune architetture).
In terzo luogo, si assume che tutta la matematica sia finita , il che significa che non vengono effettuati controlli per NaN (o zero) laddove avrebbero effetti dannosi. Si presume semplicemente che ciò non accadrà.
In quarto luogo, consente approssimazioni reciproche per divisione e radice quadrata reciproca.
Inoltre, disabilita lo zero con segno (il codice presuppone che lo zero con segno non esista, anche se l'obiettivo lo supporta) e arrotondando la matematica, che consente tra l'altro una costante piegatura in fase di compilazione.
Infine, genera codice che presuppone che non possano verificarsi interruzioni hardware a causa della segnalazione / trapping della matematica (ovvero, se questi non possono essere disabilitati sull'architettura di destinazione e, di conseguenza , si verificano , non verranno gestiti).