다음을 통해 공유


_control87, _controlfp, __control87_2

부동 소수점 컨트롤 단어를 가져오고 설정합니다. 보다 안전한 버전의 _controlfp 를 사용할 수 있습니다. _controlfp_s 를 참고 하십시오.

unsigned int _control87( 
   unsigned int new,
   unsigned int mask 
);
unsigned int _controlfp( 
   unsigned int new,
   unsigned int mask 
);
int __control87_2(
   unsigned int new,
   unsigned int mask,
   unsigned int* x86_cw,
   unsigned int* sse2_cw
);

매개 변수

  • new
    새 컨트롤 단어 비트 값입니다.

  • mask
    새 컨트롤 단어 비트를 설정하기 위한 마스크입니다.

  • x86_cw
    x87 부동 소수점 단위에 컨트롤 단어로 채워집니다. SSE2 컨트롤 단어만 설정 할 수 있도록 0 (NULL) 을 전달합니다.

  • sse2_cw
    SSE 부동 소수점 단위에 대한 컨트롤 단어입니다. x87 컨트롤 단어만 설정 할 수 있도록 0 (NULL) 을 전달합니다.

반환 값

_control87 과 _controlfp 에 대하여, 반환 값에 있는 비트는 부동 소수점의 제어 상태를 나타냅니다. _control87 에 의해 반환된 비트의 정의를 완료하려면, FLOAT.H를 참조 하십시오.

__control87_2 에 대한 반환 값 1은 성공을 의미합니다.

설명

_control87 함수는 부동 소수점 컨트롤 단어를 가져오고 설정합니다. 부동 소수점 컨트롤 단어는 플랫폼에 따라 부동 소수점 연산 패키지에서 프로그램이 정밀도, 반올림, 인피니티 모드를 바꿀 수 있도록 합니다. 또한 _control87 를 부동 소수점 예외를 감추거나 나타내기 위해 사용할 수 있습니다. 만약 mask 값이 0이라면 _control87 은 부동 소수점 컨트롤 단어를 가져옵니다. 만약 mask 값이 0이 아니라면, 컨트롤 단어에 대한 새로운 값이 설정 됩니다. mask에 있는 모든 비트(즉, 값은 1)에 대하여 new 에 해당하는 비트는 컨트롤 단어를 업데이트하기 위해 사용됩니다. 다른 말로, fpcntrl = ((fpcntrl & ~mask) | (new & mask)). fpcntrl 는 부동 소수점 컨트롤 단어입니다.

참고

기본적으로 런타임 라이브러리는 모든 부동 소수점 예외를 숨깁니다.

_controlfp 는 _control87 의 휴대용 버전으로 독립 플렛폼입니다. 이것은 Intel (x86), x64, ARM 플렛폼에서 _control87 함수와 거의 동일합니다. x86, x64, 또는 ARM 플랫폼을 대상으로 하는 경우 _control87 또는 _controlfp 를 사용하십시오.

_control87 와 _controlfp 의 차이점은 DENORMAL 값을 어떻게 처리하느냐에 있습니다. Intel (x86), x64, ARM 플랫폼에서 _control87 는 DENORMAL OPERAND 예외 마스크를 설정하고 선택 취소 할 수 있습니다. _controlfp 는 DENORMAL OPERAND 예외 마스크를 수정하지 않습니다. 이 예제에서는 _controlfp와 _control87의 차이점을 설명합니다.

_control87( _EM_INVALID, _MCW_EM ); 
// DENORMAL is unmasked by this call
_controlfp( _EM_INVALID, _MCW_EM ); 
// DENORMAL exception mask remains unchanged

마스크 상수 (mask)와 새 컨트롤 값 (new) 에 가능한 값이 아래의 16진수 표에 나타나 있습니다. 명시적으로 16진수 값을 적용하시 보다는 (_MCW_EM, _EM_INVALID 등)에 있는 임시의 상수를 이 함수의 인수로 사용하십시오.

Intel (x86) 에서 파생된 플랫폼은 하드웨어에서 DENORMAL 입,출력 값을 지원합니다. x86 작업은 DENORMAL 값을 저장하는 것입니다. ARM 플랫폼과 SSE2 지원을 가진 x64 플랫폼은 DENORMAL 피연산자와 플러시되거나 0이 될 결과를 사용 할 수 있습니다. _controlfp 와 _control87 함수는 작업을 변경하기 위해 마스크를 제공합니다. 다음 예제는 이 마스크의 사용을 보여줍니다.

_controlfp(_DN_SAVE, _MCW_DN);   
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp(_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 플랫폼에서 _control87 와 _controlfp 함수는 FPSCR 레지스터에 적용되는 함수입니다. 이 x64 아키텍처에서 MXCSR 레지스터에 저장된 SSE2 컨트롤 단어만 영향을 받습니다. Intel (x86) 플랫폼에서 _control87 와 _controlfp 는 존재하는 x87과 SSE2에 대한 컨트롤 단어에 영향을 끼칩니다. 함수 __control87_2 는 함께 또는 개별적으로 제어 될 수 있도록 x87 과 SSE2 부동 소수점 단위를 사용할 수 있습니다. 만약 두 단위에 모두 영향을 주려면, 정수 두개의 주소를 x86_cw 와 sse2_cw 에 전달합니다. 만약 하나의 단위에만 영향을 주고 싶다면, 해당 매개 변수에 대한 주소를 전달하고 남은 것에 대해 0 (NULL)을 전달합니다. 이러한 매개 변수 중 하나에 0이 전달 된 경우 함수는 부동 소수점 단위에 영향을 주지 않습니다. 이는 기능적으로 일부 코드에서 x87 부동 소수점 단위를 사용하고 나머지 부분에서 코드에서 SSE2 부동 소수점 단위를 사용하는 경우 유용할 수 있습니다. 만약 __control87_2 을 프로그램의 한부분에서 사용하고 부동 소수점 컨트롤 단어에 대한 다른 값을 설정한 후 _control87 또는 _controlfp 을 추가로 컨트롤 단어를 조작하기 위해 사용한다면, _control87 와 _controlfp 는 부동 소수점 단위의 상태를 나타내는 하나의 컨트롤 단어를 반환 하지 못할 수도 있습니다. 이런 경우, 이러한 함수는 두 컨트롤 단어 사이에 일관성이 없음을 나타내는 정수형 반환 값 내에 EM_AMBIGUOUS 플래그를 설정합니다. 이것은 반환된 컨트롤 단어가 두 부동 소수점 컨트롤 단어의 상태를 정확하게 나타내지 않을 수도 있다는 경고 입니다.

ARM과 x64 아키텍처에서, 인피니티 모드 또는 부동 소수점 정밀도 변경은 지원하지 않습니다. 이 x64 플랫폼에서 정밀도 컨트롤 마스크를 사용하는 경우 매개 변수 유효성 검사 로 만들어지는 동안에 함수는 어설션을 발생시키고 잘못된 매개변수 핸들러를 호출합니다.

참고

__control87_2 는 ARM 또는 x64 아키텍처에서는 지원하지 않습니다.사용 하는 경우 __control87_2 프로그램은 ARM에 대 한 컴파일 및 또는 x64 아키텍처에서 컴파일 하는 경우 컴파일러는 오류를 생성합니다.

공용 언어 런타임(CLR)은 오직 기본 부동 소수점 정밀도만을 지원하기 때문에 이러한 함수는 컴파일 하기 위해 /clr(공용 언어 런타임 컴파일) 또는 /clr:pure 를 사용하는 경우 무시됩니다.

16진수 값(Hexadecimal Values)

_MCW_EM 마스크에 대해 마스크 정리는 하드웨어 예외를 허용하는 예외를 설정합니다. 마스크를 설정은 예외를 숨깁니다. 만약 _EM_UNDERFLOW 또는 _EM_OVERFLOW 가 발생한 경우 하드웨어 예외가 부동 소수점 명령이 실행될 때 까지 throw되지 않습니다. _EM_UNDERFLOW 또는 _EM_OVERFLOW 가 발생하고 난 다음 즉시 하드웨어 예외를 생성하고 싶다면, FWAIT MASM 명령을 호출 하십시오.

마스크

16진수(Hex value)

상수

16진수(Hex value)

_MCW_DN (Denormal control)

0x03000000

_DN_SAVE

_DN_FLUSH

0x00000000

0x01000000

_MCW_EM (Interrupt exception mask)

0x0008001F

_EM_INVALID

_EM_DENORMAL

_EM_ZERODIVIDE

_EM_OVERFLOW

_EM_UNDERFLOW

_EM_INEXACT

0x00000010

0x00080000

0x00000008

0x00000004

0x00000002

0x00000001

_MCW_IC (Infinity control)

(ARM 또는 x64 플랫폼에서 지원하지 않습니다.)

0x00040000

_IC_AFFINE

_IC_PROJECTIVE

0x00040000

0x00000000

_MCW_RC (Rounding control)

0x00000300

_RC_CHOP

_RC_UP

_RC_DOWN

_RC_NEAR

0x00000300

0x00000200

0x00000100

0x00000000

_MCW_PC (Precision control)

(ARM 또는 x64 플랫폼에서 지원하지 않습니다.)

0x00030000

_PC_24 (24 bits)

_PC_53 (53 bits)

_PC_64 (64 bits)

0x00020000

0x00010000

0x00000000

요구 사항

루틴

필수 헤더

_control87, _controlfp, _control87_2

<float.h>

호환성에 대한 자세한 내용은 호환성을 참조하십시오.

예제

// crt_cntrl87.c
// processor: x86
// This program uses __control87_2 to output the x87 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_x87;

    // Show original x87 control word and do calculation.
    control_word_x87 = __control87_2(0, 0,
                                     &control_word_x87, 0);
    printf( "Original: 0x%.4x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

    // Set precision to 24 bits and recalculate.
    control_word_x87 = __control87_2(_PC_24, MCW_PC,
                                     &control_word_x87, 0);
    printf( "24-bit:   0x%.4x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

    // Restore default precision-control bits and recalculate.
    control_word_x87 = __control87_2( _CW_DEFAULT, MCW_PC, 
                                     &control_word_x87, 0 );
    printf( "Default:  0x%.4x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}

Output

Original: 0x0001
0.1 * 0.1 = 1.000000000000000e-002
24-bit:   0x0001
0.1 * 0.1 = 9.999999776482582e-003
Default:  0x0001
0.1 * 0.1 = 1.000000000000000e-002

해당 .NET Framework 항목

해당 사항 없음. 표준 C 함수를 호출하려면 PInvoke를 사용합니다. 자세한 내용은 플랫폼 호출 예제을 참조하십시오.

참고 항목

참조

부동 소수점 지원

_clear87, _clearfp

_status87, _statusfp, _statusfp2

_controlfp_s