Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Отключает () или включаетon (off) оптимизации, которые могут изменять тесты флагов среды с плавающей запятой и изменения в режиме.
Синтаксис
#pragma fenv_access ({ }on|off)
Замечания
По умолчанию fenv_access имеет значение off. Компилятор предполагает, что код не обращается к среде с плавающей запятой или управляет им. Если доступ к среде не требуется, компилятор может сделать больше для оптимизации кода с плавающей запятой.
Включите, fenv_access если код проверяет флаги состояния с плавающей запятой, исключения или задает флаги режима управления. Компилятор отключает оптимизацию с плавающей запятой, поэтому код может постоянно обращаться к среде с плавающей запятой.
Параметр /fp:strict командной строки автоматически включает fenv_access. Дополнительные сведения об этом и другом поведении с плавающей запятой см. в разделе /fp (указание поведения с плавающей запятой).
Существуют ограничения на способы использования fenv_accesspragma в сочетании с другими параметрами с плавающей запятой:
Невозможно включить
fenv_access, если не включена точную семантику. Точную семантику можно включить с помощьюfloat_controlpragma/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
См. также
директивы Pragma и ключевые слова __pragma и _Pragma