_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