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_access
pragma 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_control
pragmamož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řifenv_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(¤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
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(¤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