Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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 afloat_controlpragma, vagy a/fp:precisevagy/fp:strictfordí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 afloat_controlnem 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(¤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
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(¤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
Lásd még:
Pragma irányelvei, valamint a __pragma és _Pragma kulcsszavak