Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Указывает поведение чисел с плавающей запятой для функции.
Синтаксис
#pragma float_control
#pragma float_control( precise,{on|off} [ ], push)
#pragma float_control( except,{on|off} [ ], push)
#pragma float_control({ }push|pop)
Параметры
precise, , on | offpush
Указывает, следует ли включать () или отключать (onoff) точную семантику с плавающей запятой. Сведения о различиях с параметром компилятора см. в разделе "Примечания /fp:precise ". Необязательный push маркер отправляет текущий параметр float_control для внутреннего стека компилятора.
except, , on | offpush
Указывает, следует ли включить () или отключить (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 |
Другими словами, для эмуляции pragma/fp:fast/fp:precise параметров командной строки может потребоваться использовать несколько /fp:strict директив в сочетании.
Существуют ограничения на способы использования float_control директив с плавающей запятой fenv_access в pragma сочетании:
Можно использовать
float_controlтолько для заданияexcepton, если включена точную семантику. Точную семантику можно включить с помощьюfloat_controlpragma/fp:preciseпараметров или/fp:strictкомпилятора.Вы не можете отключить
float_control, если включена семантика исключений, будь тоprecisefloat_controlпараметр компилятора или параметр компилятора pragma/fp:except.Невозможно включить
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(¤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
См. также
директивы Pragma и ключевые слова __pragma и _Pragma
fenv_access pragma
fp_contract pragma