fenv_access pragma

부동 소수점 환경 플래그 테스트 및 모드 변경을 변경할 수 있는 최적화를 사용하지 않도록 설정하거나(onoff) 사용하도록 설정합니다.

구문

#pragma fenv_access ( { on | off } )

설명

기본적으로 fenv_accessoff합니다. 컴파일러는 코드가 부동 소수점 환경에 액세스하거나 조작하지 않는다고 가정합니다. 환경 액세스가 필요하지 않은 경우 컴파일러는 부동 소수점 코드를 최적화하기 위해 더 많은 작업을 수행할 수 있습니다.

코드에서 부동 소수점 상태 플래그, 예외를 테스트하거나 컨트롤 모드 플래그를 설정하는 경우 사용하도록 fenv_access 설정합니다. 컴파일러는 부동 소수점 최적화를 사용하지 않도록 설정하므로 코드가 부동 소수점 환경에 일관되게 액세스할 수 있습니다.

/fp:strict 명령줄 옵션은 자동으로 사용하도록 설정합니다fenv_access. 이 동작 및 기타 부동 소수점 동작 에 대한 자세한 내용은 /fp(부동 소수점 동작 지정)를 참조하세요.

다른 부동 소수점 설정과 함께 사용할 fenv_accesspragma 수 있는 방법에는 제한이 있습니다.

  • 정확한 의미 체계를 사용하도록 설정하지 않으면 사용하도록 설정할 fenv_access 수 없습니다. 또는 컴파일러 옵션을 사용하여 정확한 의미 체계를 /fp:precise/fp:strict 사용하도록 설정할 float_controlpragma수 있습니다. 컴파일러는 다른 부동 소수점 명령줄 옵션이 지정되지 않은 경우 기본값 /fp:precise 으로 설정됩니다.

  • 설정된 경우 fenv_access(on) 정확한 의미 체계를 사용하지 않도록 설정하는 데 사용할 float_control 수 없습니다.

지시문은 fenv_access(on) 부동 소수점 연산을 결합하는 컴퓨터 명령인 부동 소수점 수축 생성을 사용하지 않도록 설정합니다. fenv_access(off) 는 수축에 대한 이전 동작을 복원합니다. 이 동작은 Visual Studio 2022의 새로운 동작입니다. 이전 컴파일러 버전은 기본적으로 .에서 수축을 생성할 수 있습니다 fenv_access(on). 부동 소수점 수축에 대한 자세한 내용은 다음을 참조하세요 /fp:contract.

적용되는 fenv_access 최적화의 종류는 다음과 같습니다.

  • 전역 공통 하위 식 제거

  • 코드 이동

  • 상수 정리

기타 부동 소수점 pragma 지시문은 다음과 같습니다.

예제

다음은 부동 소수점 컨트롤 레지스터를 24비트 전체 자릿수로 설정하도록 on 설정하는 fenv_access 예제입니다.

// 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 키워드(keyword)