사용할
가져오고 부동 소수점 제어 단어를 설정 합니다.이것은 버전입니다 _control87, _controlfp, __control87_2 에 설명 된 대로 보안 향상 기능을 CRT의 보안 기능.
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이 아닌 값으로 설정 됩니다. (같은 경우 1)에 모든 비트에 대 한 mask의 해당 비트가 new 제어 단어를 업데이트 하는 데 사용 됩니다.In other words, fpcntrl= ((fpcntrl& ~mask) | (new & mask))는 fpcntrl 부동 소수점 제어 단어입니다. 이 시나리오에서는 currentControl 변경 완료 후의 값으로 설정 된 이 제어 단어 비트 이전 값입니다.
[!참고]
런타임 라이브러리는 기본적으로 모든 부동 소수점 예외를 마스크합니다.
_controlfp_s거의 동일 하는 _control87 인텔 (x86) 플랫폼에서 작동 하 고 MIPS 및 알파 지원 플랫폼입니다.부동 소수점 코드 MIPS 또는 ALPHA에 이식 되어 있는지 확인 하려면 사용 _controlfp_s.X 86을 대상으로 하는 경우 플랫폼을 사용 하 여 _control87 또는 _controlfp_s.
차이 _control87 및 _controlfp_s 이 두 기능을 처리 하는 방법입니다 DENORMAL 값입니다.인텔 (x86) 플랫폼에 대 한 _control87 비정상적인 피연산자 예외 마스크 해제 및 설정할 수 있습니다.이 예외 알파 플랫폼을 지원 하지 않습니다 및 _controlfp_s 비정상적인 피연산자 예외 마스크를 수정 하지 않습니다.다음 예제에서는 차이 보여 줍니다.
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call.
_controlfp( _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged.
마스크 상수는 사용할 수 있는 값 (mask) 및 새 컨트롤 값 (newControl) 16 진수 값은 다음 표에 나와 있습니다.노트북 아래 나열 된 상수는 사용할 (_MCW_EM, _EM_INVALID등)이이 함수에 인수로 명시적으로 16 진수를 제공 하는 것이 아니라 값입니다.
알파 플랫폼 DENORMAL 입력을 지원 하 고 소프트웨어에 대 한 값을 출력 합니다.Windows NT 기본 동작을 이러한 플랫폼에서 플러시 DENORMAL 입력 및 출력 값을 0으로 하는 것입니다._controlfp_s유지 하 고 입력을 플러시하고 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. Ignored on x86
_controlfp_s제어 단어에 x 87과 s s e 2를 있는 경우에 적용 됩니다.두 개의 제어 단어를 서로 일치 하지 않을 수 있습니다 (이전 호출 하기 때문에 __control87_2예를 들어,). 컨트롤 두 단어 사이 불일치가 있을 경우 _controlfp_s 설정 하는 EM_AMBIGUOUS 플래그를 currentControl.이 반환 된 제어 단어 상태 모두 부동 소수점 제어 단어를 정확 하 게 나타낼 수 없습니다 있다는 경고입니다.
에 있는 x64 부동 소수점 정밀도 변경 하면 아키텍처를 지원 하지 않습니다.정밀도 제어 마스크 해당 플랫폼에서 사용 하는 경우 잘못 된 매개 변수 처리기를의 설명에 따라 호출 됩니다 매개 변수 유효성 검사.
마스크를 올바르게 설정 되어 있지 않으면이 함수가 잘못 된 매개 변수가 예외를에 설명 된 대로 생성 매개 변수 유효성 검사.실행을 계속 수 있는 경우,이 함수는 반환 EINVAL 를 설정 하 고 errno 에 EINVAL.
로 컴파일하는 경우이 함수는 사용 되지 않습니다 /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 |
요구 사항
루틴 |
필수 헤더 |
---|---|
_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 );
}
Output
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
NET Framework에 있는 해당
해당 사항 없음.표준 C 함수를 호출할 수 있습니다 PInvoke.자세한 내용은 플랫폼 호출 예제.