-ffast-math
fait beaucoup plus que briser la stricte conformité IEEE.
Tout d'abord, bien sûr, il se casse une stricte conformité IEEE, permettant par exemple de réordonner les instructions pour obtenir quelque chose qui soit mathématiquement identique (idéalement) mais pas exactement identique en virgule flottante.
Deuxièmement, il désactive le site paramètre errno
après les fonctions mathématiques à instruction unique, ce qui signifie qu'il faut éviter d'écrire dans une variable locale au thread (cela peut faire une différence de 100 % pour ces fonctions sur certaines architectures).
Troisièmement, il fait l'hypothèse que toutes les mathématiques sont finies ce qui signifie qu'aucun contrôle de NaN (ou zéro) n'est effectué à un endroit où il aurait des effets préjudiciables. Il est simplement supposé que cela ne va pas se produire.
Quatrièmement, il permet approximations réciproques pour la division et la racine carrée réciproque.
En outre, 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 les calculs d'arrondi, ce qui permet, entre autres, de plier les constantes 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 si ces derniers ne peuvent pas être désactivés sur l'architecture cible et, par conséquent, si les interruptions matérielles ne peuvent pas se produire). se produire ils ne seront pas traités).