다음을 통해 공유


_control87, _controlfp, __control87_2

가져오고 부동 소수점 제어 단어를 설정 합니다.보다 안전한 버전의 _controlfp 입니다. see 사용할.

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 부동 소수점 단위를 사용 하 여 다음과 같이 입력 합니다.패스에 0 (NULL) SSE2 제어 단어를 설정할 수 있습니다.

  • sse2_cw
    Word의 SSE 부동 소수점 단위를 제어할 수 있습니다.패스에 0 (NULL) x 87 제어 단어를 설정할 수 있습니다.

반환 값

에 대 한 _control87 및 _controlfp, 비트 값 반환 된 부동 소수점 제어 상태를 나타냅니다.반환 되는 비트의 완전 한 정의 대 한 _control87, FLOAT을 참조 하십시오.H.

에 대 한 __control87_2, 1, 반환 됩니다 성공 여부를 나타내는.

설명

_control87 함수를 가져오고 설정 하는 부동 소수점 제어 단어입니다.부동 소수점 제어 단어 정밀도, 반올림 및 부동 소수점 연산이 패키지 무한 모드를 변경 하는 프로그램을 수 있습니다.또한 마스크 또는 부동 소수점 예외를 사용 하 여에서 마스크를 해제 _control87.경우 값에 대 한 mask 0으로 같은지 _control87 부동 소수점 제어 단어를 가져옵니다.경우 mask 입니다 제어 워드에 새 값을 0이 아닌 값으로 설정 됩니다. (같은 경우 1)에 모든 비트에 대 한 mask의 해당 비트가 new 제어 단어를 업데이트 하는 데 사용 됩니다.In other words, fpcntrl= ((fpcntrl& ~mask) | (new & mask))는 fpcntrl 부동 소수점 제어 단어입니다.  

[!참고]

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

_controlfp 플랫폼 독립의 휴대용 버전의 _control87.거의 동일 하 되는 _control87 인텔 (x86) 플랫폼에서 작동 하 고 MIPS 및 알파 지원 플랫폼입니다.부동 소수점 코드 MIPS 또는 ALPHA에 이식 되어 있는지 확인 하려면 사용 _controlfp.X 86을 대상으로 하는 경우 플랫폼을 사용 하 여 _control87 또는 _controlfp.

차이 _control87 및 _controlfp 이 두 개의 함수가 DENORMAL 값을 처리 하는 방식입니다.인텔 (x86) 플랫폼에 대 한 _control87 비정상적인 피연산자 예외 마스크 해제 및 설정할 수 있습니다.이 예외 알파 플랫폼을 지원 하지 않습니다 및 _controlfp 비정상적인 피연산자 예외 마스크를 수정 하지 않습니다.다음 예제에서는 차이 보여 줍니다.

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

마스크 상수는 사용할 수 있는 값 (mask) 및 새 컨트롤 값 (new) 16 진수 값은 다음 표에 나와 있습니다.노트북 아래 나열 된 상수는 사용할 (_MCW_EM, _EM_INVALID등)이이 함수에 인수로 명시적으로 16 진수를 제공 하는 것이 아니라 값입니다.

알파 플랫폼 DENORMAL 입력을 지원 하 고 소프트웨어에 대 한 값을 출력 합니다.Windows NT 기본 동작을 이러한 플랫폼에서 플러시 DENORMAL 입력 및 출력 값을 0으로 하는 것입니다._controlfp유지 하 고 입력을 플러시하고 DENORMAL 값을 출력 하는 새 마스크를 제공 합니다.

인텔 (x86) 플랫폼 DENORMAL 입력을 지원 하 고 하드웨어에 대 한 값을 출력 합니다.동작 DENORMAL 값을 유지할 수 있습니다._control87이 동작을 변경 하는 마스크를 제공 하지 않습니다.다음 예제에서는 이러한 차이 보여 줍니다.

_controlfp(_DN_SAVE, _MCW_DN);   
// Denormal values preserved by software on ALPHA. NOP on x86.
_controlfp(_DN_FLUSH, _MCW_DN);   
// Denormal values flushed to zero by hardware on ALPHA and x86
// processors with SSE2 support. Ignored on other x86 platforms.

둘 다 _control87 및 _controlfp 제어 단어에 x 87과 s s e 2를 존재 하는 경우에 영향을 줍니다.함수가 __control87_2 모두 x87 및 SSE2 부동 소수점 단위를 함께 또는 개별적으로 제어할 수 있습니다.두 장치 모두에 적용 하려면 원하는 경우 주소에 두 개의 정수가 전달 x86_cw 및 sse2_cw.하나의 단위에 영향을 원하는 경우 해당 매개 변수의 주소를 전달 하지만 0 (NULL)을 전달 합니다.이러한 매개 변수 중 하나에 대해 0을 전달 하면 함수 단위를 가리키고 해당 부동 주지 않습니다.X87 부동 소수점 단위 코드의 일부를 사용 하 고 SSE2 부동 소수점 단위 코드의 다른 부분을 사용 하 여 경우가이 기능이 유용할 수 있습니다.사용 하는 경우 __control87_2 프로그램의 한 부분에서 및 다른 부동 소수점 제어 단어를 설정 하 고 다음 사용 _control87 또는 _controlfp 추가로 제어 단어를 다음 조작할 수 _control87 및 _controlfp 두 부동의 상태를 나타내는 단일 제어 단어를 반환 하지 못할 수도 있습니다 단위를 가리킵니다.이러한 경우 이러한 함수를 설정의 EM_AMBIGUOUS 플래그를 두 개의 제어 단어 사이 불일치가 있음을 나타내려면 반환 되는 정수 값입니다.이 경고가 반환 된 제어 단어는 모두 부동 소수점 상태를 나타낼 수 없습니다입니다 단어를 정확 하 게 제어 합니다.

에 있는 x64 아키텍처를 변경 하 여 부동 소수점 정밀도 지원 되지 않습니다.정밀도 제어 마스크 해당 플랫폼에서 사용 하는 경우 어설션 및 잘못 된 매개 변수 처리기 호출에서에서 설명한 것 처럼 매개 변수 유효성 검사.

[!참고]

__control87_2지원 되는 x64 아키텍처입니다.사용 하는 경우 __control87_2 프로그램을 컴파일 하 고는 x64 아키텍처에서 컴파일러 오류를 생성 합니다.

이러한 함수 사용 하 여 컴파일할 때 사용 되지 않습니다 /clr(공용 언어 런타임 컴파일) 또는 /clr:pure 공용 언어 런타임에서 부동 소수점 정밀도 지원 하기 때문입니다.

16 진수 값

에 있는 _MCW_EM 마스크, 마스크 해제; 하드웨어 예외를 허용 하는 예외를 설정 합니다. 예외 마스크 설정를 숨깁니다.면은 _EM_UNDERFLOW 또는 _EM_OVERFLOW 발생 하는 다음 부동 소수점 명령이 실행 될 때까지 하드웨어 예외가 발생 합니다.하드웨어 예외를 생성할 수 바로 뒤에 _EM_UNDERFLOW 또는 _EM_OVERFLOW, 호출 MASM FWAIT 명령입니다.

마스크

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

있습니다

0x00000008

0x00000004

0x00000002

0x00000001

_MCW_IC(무한대 컨트롤)

0 x 00040000

_IC_AFFINE

_IC_PROJECTIVE

0 x 00040000

0x00000000

_MCW_RC(반올림 제어)

0x00000300

_RC_CHOP

_RC_UP

_RC_DOWN

_RC_NEAR

0x00000300

0x00000200

0x00000100

0x00000000

_MCW_PC(정밀 제어)

0x00030000

_PC_24(24 비트)

_PC_53(53 비트)

_PC_64(64 비트)

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