다음을 통해 공유


_status87, , _statusfp_statusfp2

부동 소수점 상태 단어를 가져옵니다.

구문

unsigned int _status87( void );
unsigned int _statusfp( void );
void _statusfp2(unsigned int *px86, unsigned int *pSSE2)

매개 변수

px86
이 주소에는 x87 부동 소수점 단위의 상태 단어가 채워집니다.

pSSE2
이 주소에는 SSE2 부동 소수점 단위의 상태 단어가 채워집니다.

반환 값

_status87_statusfp의 경우 반환되는 값의 비트는 부동 소수점 상태를 나타냅니다. _statusfp에서 반환하는 비트의 정의는 FLOOAT.H 포함 파일을 참조하세요. 대부분의 수학 라이브러리 함수는 부동 소수점 상태 단어를 수정하는데, 이 경우 예기치 않은 결과가 발생합니다. 최적화를 수행하면 _status87, _statusfp 및 관련 함수 호출을 다시 정렬/결합하고 해당 함수에 대한 부동 소수점 연산을 제거할 수 있습니다. /Od(사용 안 함(디버그)) 컴파일러 옵션 또는 fenv_access pragma 지시문을 사용하여 부동 소수점 작업을 다시 정렬하는 최적화를 방지합니다. 부동 소수점 상태 단어의 알려진 상태 간에 수행되는 부동 소수점 연산의 수가 적어지면 _clearfp_statusfp의 반환 값과 _statusfp2의 반환 매개 변수의 안정성이 높아집니다.

설명

_statusfp 함수는 부동 소수점 상태 단어를 가져옵니다. 상태 단어는 부동 소수점 프로세서 상태와 부동 소수점 예외 처리기에서 검색한 기타 조건(예: 부동 소수점 스택 오버플로 및 언더플로)의 조합입니다. 상태 단어의 내용을 반환하기 전에 마스킹되지 않은 예외를 확인합니다. 즉, 호출자에게 보류 중인 예외에 대한 알림이 표시됩니다. x86 플랫폼에서 _statusfp는 x87 및 SSE2 부동 소수점 상태의 조합을 반환합니다. x64 플랫폼에서 반환되는 상태는 SSE의 MXCSR 상태를 기반으로 합니다. ARM64 플랫폼에서 FPSCR 레지스터의 상태를 반환합니다 _statusfp .

_statusfp는 플랫폼 독립적이며 _status87의 이식 가능한 버전입니다. Intel(x86) 플랫폼과 동일 _status87 하며 x64 및 ARM64 플랫폼에서도 지원됩니다. 부동 소수점 코드를 모든 아키텍처로 이식할 수 있도록 하려면 _statusfp를 사용합니다. x86 플랫폼만 대상으로 하는 경우 사용 _status87 하거나 _statusfp사용할 수 있습니다.

x87 a및 SSE2 부동 소수점 프로세서가 둘 다 포함되어 있는 Pentium IV 등의 칩에 _statusfp2를 사용하는 것이 좋습니다. _statusfp2의 경우에는 x87 또는 SSE2 부동 소수점 프로세서 둘 다에 대해 부동 소수점 상태 단어를 사용하여 주소를 채웁니다. x87 및 SSE2 부동 소수점 프로세서 EM_AMBIGUOUS 를 지원하는 칩의 경우 x87 또는 _controlfp SSE2 부동 소수점 상태 단어를 참조할 수 있으므로 작업이 모호한 경우 _statusfp 1로 설정됩니다. _statusfp2 함수는 x86 플랫폼에서만 지원됩니다.

CLR(공용 언어 런타임)은 기본 부동 소수점 정밀도만 지원하므로 이러한 함수는 /clr(공용 언어 런타임 컴파일)에 유용하지 않습니다.

요구 사항

루틴에서 반환된 값 필수 헤더
_status87, , _statusfp_statusfp2 <float.h>

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

예시

// crt_statusfp.c
// Build by using: cl /W4 /Ox /nologo crt_statusfp.c
// This program creates various floating-point errors and
// then uses _statusfp to display messages that indicate these problems.

#include <stdio.h>
#include <float.h>
#pragma fenv_access(on)

double test( void )
{
   double a = 1e-40;
   float b;
   double c;

   printf("Status = 0x%.8x - clear\n", _statusfp());

   // Assignment into b is inexact & underflows:
   b = (float)(a + 1e-40);
   printf("Status = 0x%.8x - inexact, underflow\n", _statusfp());

   // c is denormal:
   c = b / 2.0;
   printf("Status = 0x%.8x - inexact, underflow, denormal\n",
            _statusfp());

   // Clear floating point status:
   _clearfp();
   return c;
}

int main(void)
{
   return (int)test();
}
Status = 0x00000000 - clear
Status = 0x00000003 - inexact, underflow
Status = 0x00080003 - inexact, underflow, denormal

참고 항목

수학 및 부동 소수점 지원
_clear87, _clearfp
_control87, , _controlfp__control87_2