fenv_access
pragma
Hiermee schakelt u (on
) of schakelt u optimalisaties (off
) in waarmee drijvendekomma-omgevingsvlagtests en moduswijzigingen kunnen worden gewijzigd.
Syntaxis
#pragma fenv_access (
{on
|off
})
Opmerkingen
Standaard is fenv_access
off
. De compiler gaat ervan uit dat uw code geen toegang heeft tot de drijvendekommaomgeving of deze bewerkt. Als er geen omgevingstoegang is vereist, kan de compiler meer doen om uw drijvendekommagecode te optimaliseren.
Schakel fenv_access
in als uw code drijvendekommagestatusvlagmen, uitzonderingen of besturingsmodusvlagmen instelt. De compiler schakelt optimalisaties voor drijvende komma uit, zodat uw code consistent toegang heeft tot de omgeving met drijvende komma.
De /fp:strict
opdrachtregeloptie schakelt automatisch fenv_access
in. Zie /fp (Geef Floating-Point gedrag op)voor meer informatie over dit en andere drijvendekommagedrag.
Er gelden beperkingen voor de manieren waarop u de fenv_access
pragma kunt gebruiken in combinatie met andere instellingen voor drijvende komma:
U kunt
fenv_access
niet inschakelen, tenzij nauwkeurige semantiek is ingeschakeld. Nauwkeurige semantiek kan worden ingeschakeld door defloat_control
pragmaof met behulp van de/fp:precise
of/fp:strict
compileropties. De compiler wordt standaard/fp:precise
als er geen andere opdrachtregeloptie voor drijvende komma is opgegeven.U kunt
float_control
niet gebruiken om nauwkeurige semantiek uit te schakelen wanneerfenv_access(on)
is ingesteld.
De fenv_access(on)
richtlijn schakelt het genereren van drijvendekommage contracties, machineinstructies die drijvendekommage-bewerkingen combineren uit.
fenv_access(off)
herstelt het vorige gedrag voor contracties. Dit gedrag is nieuw in Visual Studio 2022. Eerdere compilerversies kunnen standaard contracties genereren onder fenv_access(on)
. Zie /fp:contract
voor meer informatie over drijvendekommacontracties.
De soorten optimalisaties die onderhevig zijn aan fenv_access
zijn:
Algemene algemene subexpressie-afschaffing
Codebeweging
Constant vouwen
Andere richtlijnen voor drijvendekomma-pragma zijn:
Voorbeelden
In dit voorbeeld wordt fenv_access
ingesteld op on
om het drijvendekommagesturingselementregister in te stellen voor 24-bits precisie:
// 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
Als u #pragma fenv_access (on)
uit het vorige voorbeeld commentaar geeft, is de uitvoer anders. Dit komt doordat de compiler compilatietijd evalueert, waardoor de besturingsmodus niet wordt gebruikt.
// 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