_controlfp_s
부동 소수점 제어 단어를 가져와서 설정합니다. 이 버전의 <_controlfp
__control87_2
a0/>에는 CRT의 _control87
보안 기능에 설명된 대로 보안 기능이 향상되었습니다.
구문
errno_t _controlfp_s(
unsigned int *currentControl,
unsigned int newControl,
unsigned int mask
);
매개 변수
currentControl
현재 제어 단어 비트 값입니다.
newControl
새 제어 단어 비트 값입니다.
mask
설정할 새 제어 단어 비트의 마스크입니다.
반환 값
0(성공하는 경우) 또는 errno
값 오류 코드입니다.
설명
_controlfp_s
함수는 플랫폼 독립적이며 _control87
의 더 안전한 버전으로, currentControl
에 저장되어 있는 주소로 부동 소수점 제어 단어를 가져오고 newControl
을 사용하여 이를 설정합니다. 값의 비트는 부동 소수점 제어 상태를 나타냅니다. 부동 소수점 제어 상태를 사용하면 프로그램이 플랫폼에 따라 부동 소수점 연산 패키지에서 정밀도, 반올림 및 무한대 모드를 변경할 수 있습니다. _controlfp_s
를 사용하여 부동 소수점 예외를 마스크 또는 마스크 해제할 수도 있습니다.
mask
의 값이 0인 경우 _controlfp_s
는 부동 소수점 제어 단어를 가져와서 검색된 값을 currentControl
에 저장합니다.
mask
가 0이 아닌 경우 새 제어 단어의 새 값이 설정됩니다. mask
에서 설정된 모든 비트(즉, 1과 같음)의 경우 new
의 해당 비트가 제어 단어를 업데이트하는 데 사용됩니다. 즉, fpcntrl = ((fpcntrl & ~mask) | (newControl & mask))
부동 소수점 제어 단어는 어디에 있습니다 fpcntrl
. 이 시나리오 currentControl
에서는 변경이 완료된 후 값으로 설정되며 이전 컨트롤 단어 비트 값이 아닙니다.
참고 항목
기본적으로 런타임 라이브러리는 모든 부동 소수점 예외를 마스킹합니다.
_controlfp_s
는 Intel(x86), x64 및 ARM 플랫폼의 함수와 거의 동일합니다 _control87
. x86, x64 또는 ARM 플랫폼을 대상으로 하는 경우 사용 _control87
하거나 _controlfp_s
사용할 수 있습니다.
_control87
_controlfp_s
비정규 값을 처리하는 방법과 차이점이 있습니다. Intel(x86), x64 및 ARM 플랫폼의 _control87
경우 예외 마스크를 DENORMAL OPERAND
설정하고 지울 수 있습니다. _controlfp_s
는 예외 마스크를 DENORMAL OPERAND
수정하지 않습니다. 이 예제에서는 다음과 같은 차이를 보여 줍니다.
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call.
unsigned int current_word = 0;
_controlfp_s( ¤t_word, _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged.
마스크 상수(mask
)의 가능한 값 및 새 제어 값(newControl
)은 아래의 16진수 값 테이블에 표시되어 있습니다. 16진수 값을 명시적으로 제공하는 대신 아래에 나열된 이식 가능 상수(_MCW_EM
, _EM_INVALID
등)를 이러한 함수의 인수로 사용하세요.
Intel(x86) 파생 플랫폼은 하드웨어의 DENORMAL
입력 및 출력 값을 지원합니다. x86 동작은 값을 유지하는 DENORMAL
것입니다. ARM 플랫폼 및 SSE2 지원이 있는 x64 플랫폼을 사용하면 DENORMAL
피연산자와 결과를 플러시하거나 강제로 0으로 설정할 수 있습니다. _controlfp_s
, _controlfp
및 _control87
함수는 이 동작을 변경하는 마스크를 제공합니다. 다음 예제에서는 이 마스크의 사용을 보여 줍니다.
unsigned int current_word = 0;
_controlfp_s(¤t_word, _DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp_s(¤t_word, _DN_FLUSH, _MCW_DN);
// Denormal values flushed to zero by hardware on ARM platforms
// and x64 processors with SSE2 support. Ignored on other x86 platforms.
ARM 플랫폼에서 _controlfp_s
함수는 FPSCR 레지스터에 적용됩니다. x64 아키텍처에서는 MXCSR 레지스터에 저장된 SSE2 컨트롤 단어만 영향을 받습니다. Intel(x86) 플랫폼에서 _controlfp_s
는 x87 및 SSE2 모두에 대한 제어 단어(있는 경우)에 영향을 줍니다. 예를 들어 이전 호출__control87_2
로 인해 두 컨트롤 단어가 서로 일치하지 않을 수 있습니다. 두 컨트롤 단어 _controlfp_s
사이에 불일치가 있는 경우 플래그currentControl
를 EM_AMBIGUOUS
설정합니다. 반환된 컨트롤 단어가 두 부동 소수점 컨트롤 단어의 상태를 정확하게 나타내지 않을 수 있다는 경고입니다.
ARM 및 x64 아키텍처에서는 무한대 모드 또는 부동 소수점 정밀도 변경이 지원되지 않습니다. x64 플랫폼에서 전체 자릿수 제어 마스크를 사용하는 경우 함수는 어설션을 발생시키고 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 처리기가 호출됩니다.
마스크가 올바르게 설정되지 않은 경우 이 함수는 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 예외를 생성합니다. 계속해서 실행하도록 허용한 경우 이 함수는 EINVAL
을 반환하고 errno
를 EINVAL
로 설정합니다.
CLR(공용 언어 런타임)은 기본 부동 소수점 정밀도만 지원하므로 컴파일에 사용할 때(공용 언어 런타임 컴파일)를 사용하면 /clr
이 함수가 무시됩니다.
기본적으로 이 함수의 전역 상태는 애플리케이션으로 범위가 지정됩니다. 이 동작을 변경하려면 CRT 전역 상태를 참조하세요.
상수 및 값 마스크
_MCW_EM
마스크의 경우 마스크를 지우면 예외가 설정되며, 이를 통해 하드웨어 예외가 허용됩니다. 마스크를 설정하면 예외가 숨겨집니다. _EM_UNDERFLOW
또는 _EM_OVERFLOW
가 발생하면 다음 부동 소수점 명령이 실행될 때까지 하드웨어 예외가 throw됩니다. 하드웨어 예외를 즉시 _EM_UNDERFLOW
생성하려면 _EM_OVERFLOW
명령을 호출합니다 FWAIT MASM
.
마스크 | 16진수 값 | 상수 | 16진수 값 |
---|---|---|---|
_MCW_DN (비정상 제어) |
0x03000000 | _DN_SAVE _DN_FLUSH |
0x00000000 0x01000000 |
_MCW_EM (인터럽트 예외 마스크) |
0x0008001F | _EM_INVALID _EM_DENORMAL _EM_ZERODIVIDE _EM_OVERFLOW _EM_UNDERFLOW _EM_INEXACT |
0x00000010 0x00080000 0x00000008 0x00000004 0x00000002 0x00000001 |
_MCW_IC (무한대 제어)(ARM 또는 x64 플랫폼에서는 지원되지 않습니다.) |
0x00040000 | _IC_AFFINE _IC_PROJECTIVE |
0x00040000 0x00000000 |
_MCW_RC (반올림 제어) |
0x00000300 | _RC_CHOP _RC_UP _RC_DOWN _RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
_MCW_PC (정밀도 제어)(ARM 또는 x64 플랫폼에서는 지원되지 않습니다.) |
0x00030000 | _PC_24 (24비트)_PC_53 (53비트)_PC_64 (64비트) |
0x00020000 0x00010000 0x00000000 |
요구 사항
루틴에서 반환된 값 | 필수 헤더 |
---|---|
_controlfp_s |
<float.h> |
호환성에 대한 자세한 내용은 호환성을 참조하세요.
예시
// crt_contrlfp_s.c
// processor: x86
// This program uses _controlfp_s to output the FP control
// word, set the precision to 24 bits, and reset the status to
// the default.
#include <stdio.h>
#include <float.h>
#pragma fenv_access (on)
int main( void )
{
double a = 0.1;
unsigned int control_word;
int err;
// Show original FP control word and do calculation.
err = _controlfp_s(&control_word, 0, 0);
if ( err ) /* handle error here */;
printf( "Original: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Set precision to 24 bits and recalculate.
err = _controlfp_s(&control_word, _PC_24, MCW_PC);
if ( err ) /* handle error here */;
printf( "24-bit: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Restore default precision-control bits and recalculate.
err = _controlfp_s(&control_word, _CW_DEFAULT, MCW_PC);
if ( err ) /* handle error here */;
printf( "Default: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Original: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
24-bit: 0xa001f
0.1 * 0.1 = 9.999999776482582e-003
Default: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
참고 항목
수학 및 부동 소수점 지원
_clear87
, _clearfp
_status87
, , _statusfp
_statusfp2
_control87
, , _controlfp
__control87_2