Megosztás:


fenv_access pragma

Letiltja (on) vagy engedélyezi (off) azokat az optimalizálásokat, amelyek megváltoztathatják a lebegőpontos környezetjelző tesztjeit és üzemmódmódosításait.

Szintaxis

#pragma fenv_access ( { on | off } )

Megjegyzések

Alapértelmezés szerint fenv_accessoff. A fordító feltételezi, hogy a kód nem fér hozzá vagy nem manipulálja a lebegőpontos környezetet. Ha nincs szükség környezeti hozzáférésre, a fordító többre képes a lebegőpontos kód optimalizálásához.

Engedélyezze fenv_access, ha a kód teszteli a lebegőpontos állapotjelzőket, a kivételeket vagy a vezérlőmód jelzőit. A fordító letiltja a lebegőpontos optimalizálásokat, így a kód egységesen hozzáférhet a lebegőpontos környezethez.

A /fp:strict parancssori beállítás automatikusan engedélyezi fenv_access. Erről és más lebegőpontos viselkedésről további információt a /fp (Floating-Point viselkedésének megadása)című témakörben talál.

A fenv_accesspragma más lebegőpontos beállításokkal együtt használható módjai korlátozottak:

  • Csak akkor engedélyezheti a fenv_access, ha a pontos szemantikák engedélyezve vannak. A pontos szemantikát a float_controlpragma, vagy a /fp:precise vagy /fp:strict fordító beállításaival engedélyezheti. A fordító alapértelmezés szerint /fp:precise, ha nincs megadva más lebegőpontos parancssori beállítás.

  • A fenv_access(on) beállításakor a float_control nem tilthatja le a pontos szemantikát.

A fenv_access(on) irányelv letiltja a lebegőpontos összehúzódások, a lebegőpontos műveleteket kombináló gépi utasítások létrehozását. fenv_access(off) visszaállítja az összehúzódások korábbi viselkedését. Ez a viselkedés új a Visual Studio 2022-ben. A korábbi fordítóverziók alapértelmezés szerint összehúzódhatnak a fenv_access(on)alatt. További információ a lebegőpontos összehúzódásokról: /fp:contract.

A fenv_access hatálya alá tartozó optimalizálástípusok a következők:

  • Globális gyakori subexpression-eltávolítás

  • Kód mozgása

  • Állandó összecsukás

Egyéb lebegőpontos pragma irányelvek a következők:

Példák

Ez a példa fenv_accesson értékre állítja a lebegőpontos vezérlőregisztrálás 24 bites pontosságú beállításához:

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

Ha #pragma fenv_access (on) megjegyzést fűz az előző mintához, a kimenet eltérő. Ennek az az oka, hogy a fordító fordítási időt végez, amely nem használja a vezérlési módot.

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

Lásd még:

Pragma irányelvei, valamint a __pragma és _Pragma kulcsszavak