Delen via


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_accessoff. 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_accessin. 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_accesspragma 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 de float_controlpragmaof 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 wanneer fenv_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:contractvoor 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(&currentControl, _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(&currentControl, _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

Zie ook

Pragma-instructies en de __pragma en _Pragma trefwoorden