Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Désactive () TOUCHE) ou active (HORS TOUCHE) les optimisations qui peuvent modifier des tests de balises et les modifications en mode.
#pragma fenv_access [ON | OFF]
Notes
Par défaut, fenv_access est désactivé.
Pour plus d'informations sur le comportement à virgule flottante, consultez /fp (Spécifier le comportement de virgule flottante).
Les types d'optimisations qui sont soumises à fenv_access sont :
Élimination globale de sous-expression
Déplacement de code
Repli constant
D'autres pragmas à virgule flottante incluent :
Exemple
// pragma_directive_fenv_access_x86.cpp
// compile with: /O2
// processor: x86
#include <stdio.h>
#include <float.h>
#include <errno.h>
#pragma fenv_access (on)
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
L'exemple suivant concerne le compilateur produisent des fichiers de sortie pour les processeurs Itanium./fp:precise conserve les résultats intermédiaires dans la précision étendue où les valeurs supérieures à FLT_MAX (3.402823466e+38F) peuvent être calculées et à la suite de cette somme reçoivent le résultat 1,0, comme il doit si manuellement calculé./fp:strict conserve les résultats intermédiaires dans leur précision de source (float) afin que le premier ajout produit l'infini, qui est conservé dans toute l'expression.
// pragma_directive_fenv_access_IPF.cpp
// compile with: /O2 /fp:precise
// processor: IPF
// compiling with /fp:precise prints 1.0F
// compile with /fp:strict to print infinity
#include <stdio.h>
float arr[5] = {3.402823465e+38F,
3.402823462e+38F,
3.402823464e+38F,
3.402823463e+38F,
1.0F};
int main() {
float sum = 0;
sum = arr[0] + arr[1] - arr[2] - arr[3] + arr[4];
printf_s("%f\n", sum);
}
En commentant #pragma fenv_access (on) de l'exemple précédent, notez que la sortie est différente car le compilateur effectue l'évaluation de compilation, qui n'utilise pas le mode de contrôle.
// pragma_directive_fenv_access_2.cpp
// compile with: /O2
#include <stdio.h>
#include <float.h>
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}