fp_contract pragma

부동 소수점 수축이 발생하는지 여부를 결정합니다. 부동 소수점 수축은 두 개의 개별 부동 소수점 연산을 단일 명령으로 결합하는 FMA(Fused-Multiply-Add)와 같은 명령입니다. 각 작업 후에 반올림하는 대신 프로세서가 두 작업 후에 한 번만 반올림할 수 있으므로 이러한 지침을 사용하면 부동 소수점 정밀도에 영향을 줄 수 있습니다.

구문

#pragma fp_contract ( { on | off } )

설명

기본 컴파일러 옵션을 fp_contract 사용하는 경우 개별 off부동 소수점 지침을 유지하도록 컴파일러에 지시하는 입니다. on 가능한 경우 부동 소수점 수축 지침을 사용하도록 설정합니다fp_contract. 이 동작은 Visual Studio 2022 버전 17.0의 새로운 동작입니다. 이전 컴파일러 버전 fp_contract 에서는 기본적으로 .로 설정 on됩니다.

기본 컴파일러 옵션을 fp_contract 사용하는 경우는 다음과 같습니다 on. 이 설정은 가능한 경우 부동 소수점 수축 명령을 사용하도록 컴파일러에 지시합니다. 개별 부동 소수점 지침을 유지하도록 off 설정합니다fp_contract. Visual Studio 2022 버전 17.0 이상 fp_contract 에서는 기본적으로 off.

부동 소수점 동작에 대한 자세한 내용은 (부동 소수점 동작 지정)을 참조 /fp 하세요.

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

예시

/fp:fast 컴파일러 옵션은 기본적으로 수축을 사용하도록 설정하지만 이 예제의 #pragma fp_contract (off) 지시문은 축소를 해제합니다. 이 샘플에서 생성된 코드는 대상 프로세서에서 사용할 수 있는 경우에도 융합 곱하기 추가 명령을 사용하지 않습니다. 주석 처리 #pragma fp_contract (off)할 경우 생성된 코드는 사용 가능한 경우 fused-multiply-add 명령을 사용할 수 있습니다.

// pragma_directive_fp_contract.cpp
// On x86 and x64 compile with: /O2 /fp:fast /arch:AVX2

#include <stdio.h>

// remove the following line to enable FP contractions
#pragma fp_contract (off)

int main() {
   double z, b, t;

   for (int i = 0; i < 10; i++) {
      b = i * 5.5;
      t = i * 56.025;

      z = t * i + b;
      printf("out = %.15e\n", z);
   }
}
out = 0.000000000000000e+00
out = 6.152500000000000e+01
out = 2.351000000000000e+02
out = 5.207249999999999e+02
out = 9.184000000000000e+02
out = 1.428125000000000e+03
out = 2.049900000000000e+03
out = 2.783725000000000e+03
out = 3.629600000000000e+03
out = 4.587525000000000e+03

참고 항목

Pragma 지시문 및 __pragma_Pragma 키워드(keyword)