다음을 통해 공유


_controlfp_s

부동 소수점 제어 단어를 가져와서 설정합니다. 이 버전의 < _controlfp__control87_2a0/>에는 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( &current_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(&current_word, _DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp_s(&current_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 사이에 불일치가 있는 경우 플래그currentControlEM_AMBIGUOUS 설정합니다. 반환된 컨트롤 단어가 두 부동 소수점 컨트롤 단어의 상태를 정확하게 나타내지 않을 수 있다는 경고입니다.

ARM 및 x64 아키텍처에서는 무한대 모드 또는 부동 소수점 정밀도 변경이 지원되지 않습니다. x64 플랫폼에서 전체 자릿수 제어 마스크를 사용하는 경우 함수는 어설션을 발생시키고 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 처리기가 호출됩니다.

마스크가 올바르게 설정되지 않은 경우 이 함수는 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 예외를 생성합니다. 계속해서 실행하도록 허용한 경우 이 함수는 EINVAL을 반환하고 errnoEINVAL로 설정합니다.

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