Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Określa zachowanie zmiennoprzecinkowe dla funkcji.
Składnia
#pragma float_control
#pragma float_control( precise,{on|off} [, push])
#pragma float_control( except,{on|off} [, push])
#pragma float_control({push|pop})
Opcje
precise, , on | offpush
Określa, czy należy włączyć (on) czy wyłączyć dokładną semantyka zmiennoprzecinkowa (off). Aby uzyskać informacje na temat różnic w opcji kompilatora /fp:precise , zobacz sekcję Uwagi. Opcjonalny push token wypycha bieżące ustawienie dla float_control elementu w wewnętrznym stosie kompilatora.
except, , on | offpush
Określa, czy należy włączyć (on) lub wyłączyć semantyka wyjątków zmiennoprzecinkowych (off). Opcjonalny push token wypycha bieżące ustawienie dla float_control elementu w wewnętrznym stosie kompilatora.
except można ustawić on tylko wtedy, gdy precise jest również ustawiona wartość on.
push
Wypycha bieżące float_control ustawienie do wewnętrznego stosu kompilatora.
pop
float_control Usuwa ustawienie z góry wewnętrznego stosu kompilatora i sprawia, że nowe float_control ustawienie.
Uwagi
Element float_controlpragma nie ma takiego samego zachowania jak opcja kompilatora /fp . Jedyną float_controlpragma częścią zachowania zmiennoprzecinkowego. Należy połączyć je z dyrektywami fp_contract i fenv_accesspragma , aby ponownie utworzyć opcje kompilatora /fp . W poniższej tabeli przedstawiono równoważne pragma ustawienia dla każdej opcji kompilatora:
| Opcja | 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 |
* W wersjach programu Visual Studio przed programem Visual Studio 2022 /fp:precise zachowanie jest domyślnie ustawione na fp_contract(on).
| Opcja | 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 |
Innymi słowy, może być konieczne użycie kilku pragma dyrektyw w połączeniu, aby emulować /fp:fastopcje , /fp:precisei /fp:strict wiersza polecenia.
Istnieją ograniczenia dotyczące sposobów używania dyrektyw zmiennoprzecinkowych float_control i fenv_access w połączeniupragma:
Ustawienie można ustawić
float_controlexcepttylkoonwtedy, gdy włączono dokładną semantykę. Dokładna semantyka może być włączona przezfloat_controlpragmaelement lub przy użyciu opcji kompilatora/fp:preciselub/fp:strict.Nie można użyć
float_controlpolecenia , aby wyłączyćprecise, gdy semantyka wyjątków jest włączona, niezależnie od opcji kompilatorafloat_controlpragma/fp:exceptlub .Nie można włączyć
fenv_access, chyba że włączono dokładną semantyka, niezależnie od tego, czy jestfloat_controlpragma to opcja kompilatora, czy.Nie można użyć
float_controlpolecenia , aby wyłączyć funkcjęprecisefenv_accesspo włączeniu.
Ograniczenia te oznaczają, że kolejność niektórych dyrektyw zmiennoprzecinkowych pragma jest znacząca. Aby przejść z szybkiego modelu do ścisłego modelu przy użyciu pragma dyrektyw, użyj następującego kodu:
#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
Aby przejść od ścisłego modelu do szybkiego modelu przy użyciu float_controlpragmaelementu , użyj następującego kodu:
#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
Jeśli nie określono żadnych opcji, float_control nie ma żadnego efektu.
Dyrektywa float_control wyłącza skurcze po włączeniu precise lub except. Użyj polecenia , float_control aby wyłączyć precise lub except przywrócić poprzednie ustawienie dla skurczów. Za pomocą fp_contractpragma dyrektywy można zmienić zachowanie kompilatora w przypadku skurczów.
float_control(push) i wypchnij i float_control(pop) wyskakuje ustawienie dla skurczów w ramach float_control ustawienia na wewnętrznym stosie kompilatora. To zachowanie jest nowe w programie Visual Studio 2022.
float_control Dyrektywa w poprzednich wersjach kompilatora nie miała wpływu na ustawienia skurczu.
Przykład
W poniższym przykładzie pokazano, jak przechwycić wyjątek zmiennoprzepływowy przy użyciu polecenia pragmafloat_control.
// 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
Zobacz też
dyrektywy Pragma oraz słowa kluczowe __pragma i _Pragma
fenv_access pragma
fp_contract pragma