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.
Függvény lebegőpontos viselkedését adja meg.
Szintaxis
#pragma float_control
#pragma float_control( precise,{on|off} [, push])
#pragma float_control( except,{on|off} [, push])
#pragma float_control({push|pop})
Beállítások
precise, on | off, push
Megadja, hogy engedélyezni (on) vagy letiltani (off) a pontos lebegőpontos szemantikát. A /fp:precise fordítóval való különbségekről a Megjegyzések szakaszban talál további információt. Az opcionális push token leküldi a belső fordítóverem float_control aktuális beállítását.
except, on | off, push
Megadja, hogy engedélyezni (on) vagy letiltani (off) a lebegőpontos kivétel szemantikáját. Az opcionális push token leküldi a belső fordítóverem float_control aktuális beállítását.
except csak akkor állítható be on, ha precise is be van állítva on.
push
Az aktuális float_control beállítást a belső fordítóverembe küldi.
pop
Eltávolítja a float_control beállítást a belső fordítóverem tetejéről, és ezt teszi az új float_control beállítássá.
Megjegyzések
A float_controlpragma nem ugyanaz a viselkedése, mint a /fp fordítóbeállításnak. A float_controlpragma csak a lebegőpontos viselkedés egy részét szabályozza. A /fp fordítóbeállítások újbóli létrehozásához fp_contract és fenv_accesspragma irányelvekkel kell kombinálni. Az alábbi táblázat az egyes fordítóbeállítások egyenértékű pragma beállításait mutatja be:
| Opció | float_control(precise, *) |
float_control(except, *) |
fp_contract(*) |
fenv_access(*) |
|---|---|---|---|---|
/fp:strict |
on |
on |
off |
on |
/fp:precise |
on |
off |
off* |
off |
/fp:fast |
off |
off |
on |
off |
* A Visual Studio 2022 előtti verziókban a /fp:precise viselkedés alapértelmezés szerint fp_contract(on).
| Opció | float_control(precise, *) |
float_control(except, *) |
fp_contract(*) |
fenv_access(*) |
|---|---|---|---|---|
/fp:strict |
on |
on |
off |
on |
/fp:precise |
on |
off |
off |
off |
/fp:fast |
off |
off |
on |
off |
Más szóval előfordulhat, hogy a /fp:fast, /fp:preciseés /fp:strict parancssori beállítások emulálásához több pragma direktívát kell használnia.
Az float_control és a lebegőpontos fenv_accesspragma irányelvek együttes használatára korlátozások vonatkoznak:
A
float_controlcsak akkor állíthat beexcepton, 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
float_controlnem kapcsolhatja ki aprecise, ha a kivétel szemantikája engedélyezve van, akárfloat_controlpragma, akár/fp:exceptfordítóbeállítással.A
fenv_accesscsak akkor engedélyezheti, ha a pontos szemantika engedélyezve van, akárfloat_controlpragma, akár fordítóbeállítással.A
float_controlnem kapcsolhatja kiprecise, hafenv_accessengedélyezve van.
Ezek a korlátozások azt jelentik, hogy egyes lebegőpontos pragma irányelvek sorrendje jelentős. Ha gyors modellről szigorú modellre szeretne lépni pragma irányelvek használatával, használja a következő kódot:
#pragma float_control(precise, on) // enable precise semantics
#pragma fenv_access(on) // enable environment sensitivity
#pragma float_control(except, on) // enable exception semantics
#pragma float_control(precise, on) // enable precise semantics
#pragma fenv_access(on) // enable environment sensitivity
#pragma float_control(except, on) // enable exception semantics
#pragma fp_contract(off) // disable contractions
Ha szigorú modellről gyors modellre szeretne lépni a float_controlpragmahasználatával, használja a következő kódot:
#pragma float_control(except, off) // disable exception semantics
#pragma fenv_access(off) // disable environment sensitivity
#pragma float_control(precise, off) // disable precise semantics
#pragma fp_contract(on) // enable contractions
Ha nincs megadva beállítás, float_control nincs hatása.
A float_control irányelv letiltja az összehúzódásokat, amikor bekapcsolja precise vagy except. A float_control használatával kikapcsolhatja precise vagy except visszaállítja az előző beállítást a kontrakciókhoz. A fp_contractpragma irányelv használatával módosíthatja a fordító működését a kontrakciók esetében.
float_control(push) és float_control(pop) a float_control beállítás részeként leküldi és leküldi a float_control beállítást a belső fordítóverembe. Ez a viselkedés új a Visual Studio 2022-ben. A float_control korábbi fordítóverziók irányelve nem befolyásolta a kontrakciós beállításokat.
Példa
Az alábbi minta bemutatja, hogyan lehet észlelni egy túlcsorduló lebegőpontos kivételt pragmafloat_controlhasználatával.
// pragma_directive_float_control.cpp
// compile with: /EHa
#include <stdio.h>
#include <float.h>
double func( ) {
return 1.1e75;
}
#pragma float_control (except, on)
int main( ) {
float u[1];
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, ~_EM_OVERFLOW, _MCW_EM);
if (err != 0)
printf_s("_controlfp_s failed!\n");
try {
u[0] = func();
printf_s ("Fail");
return(1);
}
catch (...) {
printf_s ("Pass");
return(0);
}
}
Pass
Lásd még:
Pragma irányelvei, valamint a __pragma és _Pragma kulcsszavak
fenv_access pragma
fp_contract pragma