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_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 pragma i fenv_access w połączeniufloat_control:

  • Ustawienie można ustawić excepton tylko float_control wtedy, gdy włączono dokładną semantykę. Dokładna semantyka może być włączona przez float_controlpragmaelement 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 kompilatora float_controlpragma/fp:except lub .

  • Nie można włączyć fenv_access , chyba że włączono dokładną semantyka, niezależnie od tego, czy jest float_controlpragma to opcja kompilatora, czy.

  • Nie można użyć float_control polecenia , aby wyłączyć funkcję fenv_accessprecise 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_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(&currentControl, ~_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 i __pragma słowa kluczowe i _Pragma
fenv_access pragma
fp_contract pragma