다음을 통해 공유


사용할

가져오고 부동 소수점 제어 단어를 설정 합니다.이것은 버전입니다 _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.자세한 내용은 플랫폼 호출 예제.

참고 항목

참조

부동 소수점 지원

_clear87, _clearfp

_status87, _statusfp, _statusfp2