-ffast-math
fait bien plus que casser la stricte conformité IEEE.
Tout d'abord, bien sûr, il ne respecte pas la stricte conformité IEEE, permettant par exemple de réorganiser les instructions en quelque chose qui est mathématiquement le même (idéalement) mais pas exactement le même en virgule flottante.
Deuxièmement, il désactive le réglage errno
après les fonctions mathématiques à instruction unique, ce qui signifie éviter d'écrire dans une variable locale de thread (cela peut faire une différence de 100% pour ces fonctions sur certaines architectures).
Troisièmement, il suppose que toutes les mathématiques sont finies , ce qui signifie qu'aucune vérification de NaN (ou zéro) n'est effectuée là où elles auraient des effets néfastes. On suppose simplement que cela n'arrivera pas.
Quatrièmement, il permet des approximations réciproques pour la division et la racine carrée réciproque.
De plus, il désactive le zéro signé (le code suppose que le zéro signé n'existe pas, même si la cible le prend en charge) et l'arrondi mathématique, ce qui permet entre autres un repliement constant au moment de la compilation.
Enfin, il génère du code qui suppose qu'aucune interruption matérielle ne peut se produire en raison de la signalisation / du piégeage mathématique (c'est-à-dire que si celles-ci ne peuvent pas être désactivées sur l'architecture cible et se produisent par conséquent , elles ne seront pas traitées).