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
정확한 부동 소수점 의미 체계를 사용하도록 설정할지(on
off
) 또는 사용하지 않도록 설정할지 지정합니다. 컴파일러 옵션의 /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_control
pragma 컴파일러 옵션과 동일한 동작이 /fp
없습니다. float_control
pragma 부동 소수점 동작의 일부만 제어합니다. 컴파일러 옵션을 다시 /fp
만들려면 지시문과pragma fp_contract
fenv_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_control
fenv_access
수 있는 방법에는 제한이 있습니다.
정확한 의미 체계를
on
사용하는float_control
경우에만 설정할except
수 있습니다. 또는 컴파일러 옵션을 사용하여 정확한 의미 체계를/fp:precise
/fp:strict
사용하도록 설정할float_control
pragma수 있습니다.컴파일러 옵션에 의해pragma
float_control
/fp:except
예외 의미 체계를 사용하는 경우 해제하는 데 사용할float_control
precise
수 없습니다.컴파일러 옵션에 따라
float_control
pragma 정확한 의미 체계를 사용하도록 설정하지 않으면 활성화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_control
pragma이동하려면 다음 코드를 사용합니다.
#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_contract
pragma 사용하여 수축에 대한 컴파일러 동작을 변경할 수 있습니다. 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(¤tControl, ~_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
키워드
fenv_access
pragma
fp_contract
pragma