float_control pragma

함수의 부동 소수점 동작을 지정합니다.

구문

#pragma float_control
#pragma float_control( precise, { on | off } [ , push ] )
#pragma float_control( except, { on | off } [ , push ] )
#pragma float_control( { push | pop } )

옵션

precise, on | off, push
정확한 부동 소수점 의미 체계를 사용하도록 설정할지(onoff) 또는 사용하지 않도록 설정할지 지정합니다. 컴파일러 옵션의 /fp:precise 차이점에 대한 자세한 내용은 설명 섹션을 참조하세요. 선택적 push 토큰은 내부 컴파일러 스택에 대한 float_control 현재 설정을 푸시합니다.

except, on | off, push
부동 소수점 예외 의미 체계를 사용하도록 설정할지(on) 또는 사용하지 않도록 설정할off지 지정합니다. 선택적 push 토큰은 내부 컴파일러 스택에 대한 float_control 현재 설정을 푸시합니다.

except 은 (을)로 on 설정된 경우에만 precise 설정할 수 있습니다 on.

push
현재 float_control 설정을 내부 컴파일러 스택에 푸시합니다.

pop
float_control 내부 컴파일러 스택의 맨 위에서 설정을 제거하고 새 float_control 설정을 만듭니다.

설명

float_controlpragma 컴파일러 옵션과 동일한 동작이 /fp 없습니다. float_controlpragma 부동 소수점 동작의 일부만 제어합니다. 컴파일러 옵션을 다시 /fp 만들려면 지시문과pragmafp_contractfenv_access결합해야 합니다. 다음 표에서는 각 컴파일러 옵션에 해당하는 pragma 설정을 보여줍니다.

옵션 float_control(precise, *) float_control(except, *) fp_contract(*) fenv_access(*)
/fp:strict on on off on
/fp:precise on off off* off
/fp:fast off off on off

* Visual Studio 2022 이전 버전의 Visual Studio에서는 동작이 /fp:precise 기본값으로 지정 fp_contract(on)됩니다.

옵션 float_control(precise, *) float_control(except, *) fp_contract(*) fenv_access(*)
/fp:strict on on off on
/fp:precise on off off off
/fp:fast off off on off

즉, 여러 pragma 지시문을 함께 사용하여 , /fp:precise/fp:strict 명령줄 옵션을 에/fp:fast뮬레이트해야 할 수 있습니다.

부동 소수점 pragma 지시문을 조합하여 사용할 float_controlfenv_access 수 있는 방법에는 제한이 있습니다.

  • 정확한 의미 체계를 on 사용하는 float_control 경우에만 설정할 except 수 있습니다. 또는 컴파일러 옵션을 사용하여 정확한 의미 체계를 /fp:precise/fp:strict 사용하도록 설정할 float_controlpragma수 있습니다.

  • 컴파일러 옵션에 의해pragmafloat_control/fp:except 예외 의미 체계를 사용하는 경우 해제하는 데 사용할 float_controlprecise 수 없습니다.

  • 컴파일러 옵션에 따라 float_controlpragma 정확한 의미 체계를 사용하도록 설정하지 않으면 활성화 fenv_access 할 수 없습니다.

  • 사용하도록 설정된 경우 fenv_access 해제 precise 하는 데 사용할 float_control 수 없습니다.

이러한 제한은 일부 부동 소수점 pragma 지시문의 순서가 중요하다는 것을 의미합니다. 지시문을 사용하여 pragma 빠른 모델에서 엄격한 모델로 이동하려면 다음 코드를 사용합니다.

#pragma float_control(precise, on)  // enable precise semantics
#pragma fenv_access(on)             // enable environment sensitivity
#pragma float_control(except, on)   // enable exception semantics
#pragma float_control(precise, on)  // enable precise semantics
#pragma fenv_access(on)             // enable environment sensitivity
#pragma float_control(except, on)   // enable exception semantics
#pragma fp_contract(off)            // disable contractions

엄격한 모델에서 빠른 모델로 float_controlpragma이동하려면 다음 코드를 사용합니다.

#pragma float_control(except, off)  // disable exception semantics
#pragma fenv_access(off)            // disable environment sensitivity
#pragma float_control(precise, off) // disable precise semantics
#pragma fp_contract(on)             // enable contractions

옵션을 지정 float_control 하지 않으면 아무런 효과가 없습니다.

지시문은 float_control 켜거나 except을(를) 켜 precise 면 수축을 사용하지 않도록 설정합니다. 수축에 float_control 대한 이전 설정을 해제 precise 하거나 except 복원하는 데 사용합니다. 지시문을 fp_contractpragma 사용하여 수축에 대한 컴파일러 동작을 변경할 수 있습니다. float_control(push) 내부 float_control(pop) 컴파일러 스택에 설정의 float_control 일부로 수축 설정을 푸시하고 팝합니다. 이 동작은 Visual Studio 2022의 새로운 동작입니다. 이전 컴파일러 버전의 지시문은 float_control 수축 설정에 영향을 미치지 않았습니다.

예시

다음 샘플에서는 을 사용하여 pragmafloat_control오버플로 부동 소수점 예외를 catch하는 방법을 보여 줍니다.

// pragma_directive_float_control.cpp
// compile with: /EHa
#include <stdio.h>
#include <float.h>

double func( ) {
   return 1.1e75;
}

#pragma float_control (except, on)

int main( ) {
   float u[1];
   unsigned int currentControl;
   errno_t err;

   err = _controlfp_s(&currentControl, ~_EM_OVERFLOW, _MCW_EM);
   if (err != 0)
      printf_s("_controlfp_s failed!\n");

   try  {
      u[0] = func();
      printf_s ("Fail");
      return(1);
   }

   catch (...)  {
      printf_s ("Pass");
      return(0);
   }
}
Pass

참고 항목

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