Dela via


fenv_access pragma

Inaktiverar (on) eller aktiverar (off) optimeringar som kan ändra flyttalsmiljöns flaggtester och lägesändringar.

Syntax

#pragma fenv_access ( { on | off } )

Anmärkningar

Som standard är fenv_accessoff. Kompilatorn förutsätter att koden inte kommer åt eller manipulerar flyttalsmiljön. Om miljöåtkomst inte krävs kan kompilatorn göra mer för att optimera flyttalskoden.

Aktivera fenv_access om koden testar flyttalsstatusflaggor, undantag eller anger flaggor för kontrollläge. Kompilatorn inaktiverar optimeringar av flyttalser så att koden kan komma åt flyttalsmiljön konsekvent.

Kommandoradsalternativet /fp:strict aktiverar automatiskt fenv_access. Mer information om detta och andra flyttalsbeteenden finns i /fp (Ange Floating-Point beteende).

Det finns begränsningar för hur du kan använda fenv_accesspragma i kombination med andra flyttalsinställningar:

  • Du kan inte aktivera fenv_access om inte exakta semantik är aktiverade. Exakta semantik kan aktiveras antingen av float_controlpragmaeller med hjälp av /fp:precise eller /fp:strict kompilatoralternativ. Kompilatorn använder som standard /fp:precise om inget annat kommandoradsalternativ för flyttals har angetts.

  • Du kan inte använda float_control för att inaktivera exakta semantik när fenv_access(on) har angetts.

fenv_access(on)-direktivet inaktiverar generering av flyttal sammandragningar, datorinstruktioner som kombinerar flyttalsåtgärder. fenv_access(off) återställer det tidigare beteendet för sammandragningar. Det här beteendet är nytt i Visual Studio 2022. Tidigare kompilatorversioner kan generera sammandragningar som standard under fenv_access(on). Mer information om flyttalskontraktioner finns i /fp:contract.

De typer av optimeringar som omfattas av fenv_access är:

  • Global gemensam eliminering av underuttryck

  • Kodrörelse

  • Konstant vikning

Andra flyttalsdirektiv pragma omfattar:

Exempel

I det här exemplet anges fenv_access till on för att ange flyttalskontrollregistret för 24-bitars precision:

// 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

Om du kommenterar ut #pragma fenv_access (on) från föregående exempel är utdata annorlunda. Det beror på att kompilatorn utför kompileringstidsutvärdering, som inte använder kontrollläget.

// 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

Se även

Pragma-direktiv och nyckelorden __pragma och _Pragma