float_control
pragma
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
| off
push
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
| off
push
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_control
pragma nie ma takiego samego zachowania jak opcja kompilatora /fp
. Jedyną float_control
pragma częścią zachowania zmiennoprzecinkowego. Należy połączyć je z dyrektywami fp_contract
i fenv_access
pragma , 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:fast
opcje , /fp:precise
i /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_control
except
tylkoon
wtedy, gdy włączono dokładną semantykę. Dokładna semantyka może być włączona przezfloat_control
pragmaelement lub przy użyciu opcji kompilatora/fp:precise
lub/fp:strict
.Nie można użyć
float_control
polecenia , aby wyłączyćprecise
, gdy semantyka wyjątków jest włączona, niezależnie od opcji kompilatorafloat_control
pragma/fp:except
lub .Nie można włączyć
fenv_access
, chyba że włączono dokładną semantyka, niezależnie od tego, czy jestfloat_control
pragma to opcja kompilatora, czy.Nie można użyć
float_control
polecenia , aby wyłączyć funkcjęprecise
fenv_access
po 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_control
pragmaelementu , 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_contract
pragma 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