Поделиться через


fenv_access pragma

Отключает () или включаетoff (on) оптимизации, которые могут изменять тесты флагов среды с плавающей запятой и изменения в режиме.

Синтаксис

#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(&currentControl, _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(&currentControl, _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 слова