fenv_access
pragma
Désactive (on
) ou active (off
) des optimisations susceptibles de modifier les tests d’indicateur d’environnement à virgule flottante et les modifications du mode.
Syntaxe
#pragma fenv_access (
{on
|off
})
Notes
Par défaut, fenv_access
est off
. Le compilateur part du principe que votre code n’accède pas ou ne manipule pas l’environnement à virgule flottante. Si l’accès à l’environnement n’est pas nécessaire, le compilateur peut faire plus pour optimiser votre code à virgule flottante.
Activez fenv_access
si votre code teste des indicateurs d’état à virgule flottante, des exceptions ou définit des indicateurs de mode de contrôle. Le compilateur désactive les optimisations à virgule flottante, afin que votre code puisse accéder à l’environnement à virgule flottante de manière cohérente.
L’option /fp:strict
de ligne de commande active fenv_access
automatiquement . Pour plus d’informations sur ce comportement et d’autres comportements à virgule flottante, consultez /fp (Spécifier le comportement à virgule flottante).
Il existe des restrictions sur les façons dont vous pouvez utiliser la fenv_access
pragma combinaison avec d’autres paramètres à virgule flottante :
Vous ne pouvez pas activer
fenv_access
, sauf si la sémantique précise est activée. La sémantique précise peut être activée par lefloat_control
pragmaou à l’aide des options du/fp:precise
compilateur./fp:strict
Le compilateur a la valeur par défaut/fp:precise
si aucune autre option de ligne de commande à virgule flottante n’est spécifiée.Vous ne pouvez pas utiliser
float_control
pour désactiver la sémantique précise quandfenv_access(on)
elle est définie.
La fenv_access(on)
directive désactive la génération de contractions à virgule flottante, des instructions de machine qui combinent des opérations à virgule flottante. fenv_access(off)
restaure le comportement précédent pour les contractions. Ce comportement est nouveau dans Visual Studio 2022. Les versions précédentes du compilateur peuvent générer des contractions par défaut sous fenv_access(on)
. Pour plus d’informations sur les contractions à virgule flottante, consultez /fp:contract
.
Les types d’optimisations soumis sont fenv_access
les suivants :
Élimination globale de sous-expressions communes
Déplacement de code
Pliage constant
Voici d’autres directives à virgule pragma flottante :
Exemples
Cet exemple montre comment définir fenv_access
on
le registre de contrôle à virgule flottante pour la précision 24 bits :
// pragma_directive_fenv_access_x86.cpp
// compile with: /O2 /arch:IA32
// 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);
}
out=9.999999776482582e-03
Si vous commentez #pragma fenv_access (on)
à partir de l’exemple précédent, la sortie est différente. C’est parce que le compilateur effectue une évaluation au moment de la compilation, qui n’utilise pas le mode de contrôle.
// pragma_directive_fenv_access_2.cpp
// compile with: /O2 /arch:IA32
#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);
}
out=1.000000000000000e-02