_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. 자세한 내용은 플랫폼 호출 예제.