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
Указывает, следует ли включать () или отключать (on
off
) точную семантику с плавающей запятой. Сведения о различиях с параметром компилятора см. в разделе "Примечания /fp:precise
". Необязательный push
маркер отправляет текущий параметр float_control
для внутреннего стека компилятора.
except
, , on
| off
push
Указывает, следует ли включить () или отключить (on
off
) семантику исключения с плавающей запятой. Необязательный push
маркер отправляет текущий параметр float_control
для внутреннего стека компилятора.
except
может быть задано on
значение только в том случае, если precise
также задано значение on
.
push
Отправляет текущий float_control
параметр во внутренний стек компилятора.
pop
float_control
Удаляет параметр из верхней части внутреннего стека компилятора и делает его новымfloat_control
.
Замечания
Такое float_control
pragma же поведение не совпадает с параметром компилятора /fp
. Единственное float_control
pragma управление частью поведения с плавающей запятой. Он должен сочетаться с fp_contract
директивами и fenv_access
pragma создавать параметры компилятора /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
только для заданияexcept
on
, если включена точную семантику. Точную семантику можно включить с помощьюfloat_control
pragma/fp:precise
параметров или/fp:strict
компилятора.Вы не можете отключить
float_control
, если включена семантика исключений, будь тоprecise
float_control
параметр компилятора или параметр компилятора pragma/fp:except
.Невозможно включить
fenv_access
, если не включена точную семантику, будь тоfloat_control
pragma параметр компилятора или параметр.Вы не можете отключить
float_control
precise
его при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_control
pragmaследующий код:
#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_contract
pragma можно использовать для изменения поведения компилятора на контрактах.
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