float_control pragma

Указывает поведение чисел с плавающей запятой для функции.

Синтаксис

#pragma float_control
#pragma float_control( precise, { on | off } [ , push ] )
#pragma float_control( except, { on | off } [ , push ] )
#pragma float_control( { push | pop } )

Параметры

precise, on | off, push
Указывает, следует ли включать () или отключать (onoff) точную семантику с плавающей запятой. Сведения о различиях с параметром компилятора см. в разделе "Примечания /fp:precise ". Необязательный push маркер отправляет текущий параметр float_control для внутреннего стека компилятора.

except, on | off, push
Указывает, следует ли включить () или отключить (onoff) семантику исключения с плавающей запятой. Необязательный push маркер отправляет текущий параметр float_control для внутреннего стека компилятора.

except может быть задано on значение только в том случае, если precise также задано значение on.

push
Отправляет текущий float_control параметр во внутренний стек компилятора.

pop
float_control Удаляет параметр из верхней части внутреннего стека компилятора и делает его новымfloat_control.

Замечания

Такое float_controlpragma же поведение не совпадает с параметром компилятора /fp . Единственное float_controlpragma управление частью поведения с плавающей запятой. Он должен сочетаться с fp_contract директивами и fenv_accesspragma создавать параметры компилятора /fp . В следующей таблице показаны эквивалентные pragma параметры для каждого параметра компилятора:

Параметр 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

* В версиях Visual Studio до Visual Studio 2022 /fp:precise поведение по умолчанию.fp_contract(on)

Параметр 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

Другими словами, для эмуляции /fp:precise/fp:fast/fp:strict параметров командной строки может потребоваться использовать несколько pragma директив в сочетании.

Существуют ограничения на способы использования float_control директив с плавающей запятой pragma в fenv_access сочетании:

  • Можно использовать float_control только для задания excepton , если включена точную семантику. Точную семантику можно включить с помощью float_controlpragma/fp:precise параметров или /fp:strict компилятора.

  • Вы не можете отключитьfloat_control, если включена семантика исключений, будь то float_controlpragma параметр компилятора или параметр компилятора /fp:exceptprecise.

  • Невозможно включить fenv_access , если не включена точную семантику, будь то float_controlpragma параметр компилятора или параметр.

  • Вы не можете отключить float_controlprecise его при fenv_access включении.

Эти ограничения означают, что порядок некоторых директив с плавающей запятой pragma является значительным. Чтобы перейти от быстрой модели к строгой модели с помощью pragma директив, используйте следующий код:

#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

Чтобы перейти от строгой модели к быстрой модели, используйте float_controlpragmaследующий код:

#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

Если параметры не указаны, float_control не действует.

Директива float_control отключает контракты при включении precise или exceptвключении. float_control Использование для отключения precise или except восстановления предыдущего параметра для сокращений. Директиву fp_contractpragma можно использовать для изменения поведения компилятора на контрактах. float_control(push) и float_control(pop) отправьте и появляется параметр для контрактов в составе float_control параметра во внутреннем стеке компилятора. Это новое поведение в Visual Studio 2022. Директива float_control в предыдущих версиях компилятора не влияет на параметры контракта.

Пример

В следующем примере показано, как перехватывать исключение с плавающей запятой переполнения с помощью 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

См. также

Директивы Pragma и __pragma_Pragma ключевое слово
fenv_access pragma
fp_contract pragma