Sdílet prostřednictvím


fenv_access pragma

Zakáže (on) nebo povolí (off) optimalizace, které by mohly změnit testy a změny režimu prostředí s plovoucí desetinou čárkou.

Syntaxe

#pragma fenv_access ( { on | off } )

Poznámky

Ve výchozím nastavení fenv_access je off. Kompilátor předpokládá, že váš kód nemá přístup k prostředí s plovoucí desetinou čárkou nebo s ním manipuluje. Pokud přístup k prostředí není povinný, kompilátor může provést větší optimalizaci kódu s plovoucí desetinou čárkou.

Povolte fenv_access , pokud kód testuje příznaky stavu s plovoucí desetinou čárkou, výjimky nebo nastaví příznaky režimu řízení. Kompilátor zakáže optimalizace s plovoucí desetinou čárkou, aby váš kód mohl konzistentně přistupovat k prostředí s plovoucí desetinou čárkou.

Možnost příkazového /fp:strict řádku se automaticky povolí fenv_access. Další informace o tomto a dalším chování s plovoucí desetinou čárkou najdete v tématu /fp (určení chování s plovoucí desetinou čárkou).

Existují omezení způsobů použití fenv_accesspragma kombinace s jinými nastaveními s plovoucí desetinou čárkou:

  • Pokud není povolená přesná sémantika, nemůžete ji povolit fenv_access . Přesnou sémantiku může povolit buď float_controlpragmamožnost , nebo pomocí možností kompilátoru /fp:strict/fp:precise. Kompilátor se ve výchozím nastavení nastaví, /fp:precise pokud není zadána žádná jiná možnost příkazového řádku s plovoucí desetinou čárkou.

  • Nemůžete použít float_control k zakázání přesné sémantiky při fenv_access(on) nastavení.

Direktiva fenv_access(on) zakazuje generování kontraktů s plovoucí desetinou čárkou, strojové instrukce, které kombinují operace s plovoucí desetinou čárkou. fenv_access(off) obnoví předchozí chování pro kontrakce. Toto chování je v sadě Visual Studio 2022 nové. Předchozí verze kompilátoru můžou ve výchozím nastavení generovat kontrakty v části fenv_access(on). Další informace o kontraktech s plovoucí desetinou čárkou naleznete v tématu /fp:contract.

Druhy optimalizací, které jsou předmětem fenv_access :

  • Globální běžná eliminace dílčího výrazu

  • Pohyb kódu

  • Skládací konstanta

Mezi další direktivy s plovoucí desetinou čárkou pragma patří:

Příklady

Tento příklad nastaví fenv_access nastavení on registru ovládacího prvku s plovoucí desetinnou čárkou pro 24bitovou přesnost:

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

Pokud zakomentujete #pragma fenv_access (on) z předchozí ukázky, výstup se liší. Je to proto, že kompilátor vyhodnotuje dobu kompilace, která nepoužívá řídicí režim.

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

Viz také

Direktivy Pragma a __pragma_Pragma klíčová slova