fenv_access
pragma
부동 소수점 환경 플래그 테스트 및 모드 변경을 변경할 수 있는 최적화를 사용하지 않도록 설정하거나(on
off
) 사용하도록 설정합니다.
구문
#pragma fenv_access (
{on
|off
})
설명
기본적으로 fenv_access
는 off
합니다. 컴파일러는 코드가 부동 소수점 환경에 액세스하거나 조작하지 않는다고 가정합니다. 환경 액세스가 필요하지 않은 경우 컴파일러는 부동 소수점 코드를 최적화하기 위해 더 많은 작업을 수행할 수 있습니다.
코드가 부동 소수점 상태 플래그, 예외 또는 컨트롤 모드 플래그를 설정하는 경우 사용하도록 fenv_access
설정합니다. 컴파일러는 부동 소수점 최적화를 사용하지 않도록 설정하므로 코드가 부동 소수점 환경에 일관되게 액세스할 수 있습니다.
/fp:strict
명령줄 옵션은 자동으로 사용하도록 설정합니다fenv_access
. 이 동작 및 기타 부동 소수점 동작 에 대한 자세한 내용은 /fp(부동 소수점 동작 지정)를 참조하세요.
다른 부동 소수점 설정과 함께 사용할 fenv_access
pragma 수 있는 방법에는 제한이 있습니다.
정확한 의미 체계를 사용하도록 설정하지 않으면 사용하도록 설정할
fenv_access
수 없습니다. 또는 컴파일러 옵션을 사용하여 정확한 의미 체계를/fp:precise
/fp:strict
사용하도록 설정할float_control
pragma수 있습니다. 컴파일러는 다른 부동 소수점 명령줄 옵션이 지정되지 않은 경우 기본값/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(¤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