/fp (Spécifier le comportement de virgule flottante)
Mise à jour : novembre 2007
Spécifie le comportement de virgule flottante dans un fichier de code source.
/fp:[precise | except[-] | fast | strict ]
Indicateurs
precise
Il s'agit de la valeur par défaut.Améliore la cohérence des tests en virgule flottante à des fins d'égalité ou d'inégalité en désactivant les optimisations qui peuvent changer la précision des calculs en virgule flottante, ce qui est indispensable pour une compatibilité ANSI stricte. Par défaut, le compilateur utilise les registres 80 bits du coprocesseur pour stocker les résultats intermédiaires des calculs en virgule flottante. Cette approche augmente la vitesse du programme tout en diminuant sa taille. Cependant, dans la mesure où le calcul implique des types de données en virgule flottante qui sont représentés en mémoire par moins de 80 bits, le fait de faire subir aux bits supplémentaires de précision (80 bits moins le nombre de bits dans un type en virgule flottante plus petit) un calcul long peut donner lieu à des résultats incohérents.
Avec /fp:precise sur des processeurs x86, le compilateur arrondit les variables de type float à la précision correcte pour les assignations et les casts ainsi que lors du passage de paramètres à une fonction. Cet arrondi garantit que les données ne conserveront pas d'importance supérieure à la capacité de leur type. Un programme compilé avec /fp:precise peut être plus lent et plus volumineux qu'un programme compilé sans /fp:precise. En effet, /fp:precise désactive les éléments intrinsèques ; les routines de la bibliothèque Runtime standard sont utilisées à la place. Pour plus d'informations, consultez /Oi (Générer des fonctions intrinsèques).
/fp:precise active le comportement de virgule flottante suivant :
/fp:precise active les contractions (ou remplacement de plusieurs opérations par une opération composite se terminant par un seul arrondi).
Les optimisations d'expression qui ne sont pas valides pour des valeurs spéciales (valeurs non numériques, +l'infini, -l'infini, +0, -0) ne sont pas autorisées. Les optimisations x-x => 0, x*0 => 0, x-0 => x, x+0 => x et 0-x => -x sont toutes non valides pour différentes raisons (consultez les normes IEEE 754 et C99).
Le compilateur gère correctement les comparaisons qui impliquent des valeurs non numériques (NaN). Par exemple, x != x prend la valeur true si x est une valeur non numérique et les comparaisons ordonnées qui impliquent une valeur non numérique lèvent une exception.
L'évaluation d'expression se conforme à C99 FLT_EVAL_METHOD=2, à une exception près. Lors de la programmation de processeurs x86, comme la FPU possède une précision de 53 bits, elle sera considérée comme un long double précision.
La multiplication par 1,0 exactement est transformée en une utilisation de l'autre facteur. x*y*1.0 est transformé en x*y. De même, x*1.0*y est transformé en x*y.
La division par 1,0 exactement est transformée en une utilisation du dividende. x*y/1.0 est transformé en x*y. De même, x/1.0*y est transformé en x*y.
L'utilisation de /fp:precise avec fenv_access ayant la valeur ON désactive certaines optimisations telles que les évaluations au moment de la compilation d'expressions à virgule flottante. Par exemple, si vous remplacez le mode d'arrondi par _control87, _controlfp, __control87_2, et si le compilateur exécute un calcul en virgule flottante, le mode d'arrondi que vous avez spécifié n'est pas appliqué à moins que fenv_access ait la valeur ON.
/fp:precise remplace l'option du compilateur /Op.
fast
Crée le code le plus rapide dans la majorité des cas. /fp:fast ne peut pas être utilisé avec /fp:strict ou /fp:precise ; la dernière option spécifiée sur la ligne de commande sera utilisée. /fp:fast et /fp:except génèrent une erreur du compilateur.La sélection de /Za, /Ze (Désactiver les extensions de langage) (compatibilité ANSI) et de /fp:fast peut entraîner un comportement inattendu. Par exemple, les opérations en virgule flottante simple précision ne peuvent pas être arrondies en simple précision.
except[-]
Modèle d'exception à virgule flottante fiable. Les exceptions sont immédiatement levées après leur déclenchement. Cette option est désactivée par défaut. L'ajout explicite d'un signe moins à l'option entraîne sa désactivation.strict
Modèle de virgule flottante le plus strict. /fp:strict entraîne la désactivation (OFF) de fp_contract et l'activation (ON) de fenv_access. /fp:except est impliqué et peut être désactivé en spécifiant /fp:except- explicitement. En cas d'utilisation avec /fp:except-, /fp:strict applique une sémantique à virgule flottante stricte, mais sans tenir compte des événements exceptionnels.
Notes
Plusieurs options /fp peuvent être spécifiées dans la même compilation.
Pour contrôler le comportement de virgule flottante par fonction, consultez le pragma float_control.
La plupart des optimisations à virgule flottante liées à /fp:strict, /fp:except (et à ses pragmas correspondants), ainsi qu'au pragma fp_contract dépendent de l'ordinateur. /fp:strict et /fp:except ne sont pas compatibles avec /clr.
/fp:precise doit répondre à la plupart des exigences d'une application en matière de virgule flottante. Le cas échéant, vous pouvez utiliser /fp:except et /fp:strict, mais cela peut entraîner une certaine baisse des performances. Si les performances sont très importantes, il se peut que vous souhaitiez utiliser /fp:fast.
/fp:strict, /fp:fast et /fp:precise sont des modes de précision (exactitude). Une seule de ces options peut être active à la fois. Si /fp:strict et /fp:precise sont spécifiés, le compilateur utilise celui qu'il traite en dernier. Vous ne pouvez pas spécifier /fp:strict et /fp:fast à la fois.
Pour plus d'informations, consultez https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/floapoint.asp.
Pour définir cette option du compilateur dans l'environnement de développement Visual Studio
Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d'informations, consultez Comment : ouvrir les pages de propriétés d'un projet.
Développez le nœud Propriétés de configuration.
Développez le nœud C/C++.
Sélectionnez la page de propriétés Génération de code.
Modifiez la propriété Modèle de virgule flottante.
Pour définir cette option du compilateur par programme
- Consultez floatingPointModel.