fenv_access
pragma
Отключает () или включаетoff
(on
) оптимизации, которые могут изменять тесты флагов среды с плавающей запятой и изменения в режиме.
Синтаксис
#pragma fenv_access (
{ }on
|off
)
Замечания
По умолчанию fenv_access
имеет значение off
. Компилятор предполагает, что код не обращается к среде с плавающей запятой или управляет им. Если доступ к среде не требуется, компилятор может сделать больше для оптимизации кода с плавающей запятой.
Включите, fenv_access
если код проверяет флаги состояния с плавающей запятой, исключения или задает флаги режима управления. Компилятор отключает оптимизацию с плавающей запятой, поэтому код может постоянно обращаться к среде с плавающей запятой.
Параметр /fp:strict
командной строки автоматически включает fenv_access
. Дополнительные сведения об этом и другом поведении с плавающей запятой см. в разделе /fp (указание поведения с плавающей запятой).
Существуют ограничения на способы использования fenv_access
pragma в сочетании с другими параметрами с плавающей запятой:
Невозможно включить
fenv_access
, если не включена точную семантику. Точную семантику можно включить с помощьюfloat_control
pragma/fp:precise
параметров или/fp:strict
компилятора. Компилятор по умолчанию не/fp:precise
указан, если не указан другой параметр командной строки с плавающей запятой.Вы не можете использовать
float_control
для отключения точной семантики приfenv_access(on)
установке.
Директива fenv_access(on)
отключает создание контрактов с плавающей запятой, инструкции компьютера, которые объединяют операции с плавающей запятой. fenv_access(off)
восстанавливает предыдущее поведение для сокращений. Это новое поведение в Visual Studio 2022. Предыдущие версии компилятора могут создавать контракты по умолчанию в fenv_access(on)
разделе . Дополнительные сведения о контрактах с плавающей запятой см. в разделе /fp:contract
.
Типы оптимизаций, которые подлежат выполнению fenv_access
:
Глобальное исключение общей части выражения
Перемещение кода
Свертывание констант
Другие директивы с плавающей запятой pragma включают:
Примеры
В этом примере показано fenv_access
, как on
задать регистр элемента управления с плавающей запятой для 24-разрядной точности:
// pragma_directive_fenv_access_x86.cpp
// compile with: /O2 /arch:IA32
// processor: x86
#include <stdio.h>
#include <float.h>
#include <errno.h>
#pragma fenv_access (on)
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=9.999999776482582e-03
Если вы закомментируете #pragma fenv_access (on)
из предыдущего примера, выходные данные отличаются. Это связано с тем, что компилятор выполняет оценку во время компиляции, которая не использует режим управления.
// pragma_directive_fenv_access_2.cpp
// compile with: /O2 /arch:IA32
#include <stdio.h>
#include <float.h>
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=1.000000000000000e-02