_fpieee_flt
IEEE 부동 소수점 예외에 대한 사용자 정의 트랩 처리기를 호출합니다.
구문
int _fpieee_flt(
unsigned long excCode,
struct _EXCEPTION_POINTERS *excInfo,
int handler(_FPIEEE_RECORD *)
);
매개 변수
excCode
예외 코드입니다.
excInfo
Windows NT 예외 정보 구조체에 대한 포인터입니다.
handler
사용자의 IEEE 트랩 처리기 루틴에 대한 포인터입니다.
반환 값
_fpieee_flt
의 반환 값은 handler
의해 반환되는 값입니다. 따라서 IEEE 필터 루틴은 SEH(구조적 예외 처리) 메커니즘의 예외 절에서 사용될 수 있습니다.
설명
_fpieee_flt
함수는 IEEE 부동 소수점 예외에 대한 사용자 정의 트랩 처리기를 호출하고 모든 관련 정보를 제공합니다. 이 루틴은 필요할 때 자신의 IEEE 예외 처리기를 호출하는 SEH 메커니즘에서 예외 필터로 사용됩니다.
Fpieee.h에 정의된 _FPIEEE_RECORD
구조체는 IEEE 부동 소수점 예외에 대한 정보를 포함합니다. 이 구조체는 _fpieee_flt
에 의해 사용자 정의 트랩 처리기로 전달됩니다.
_FPIEEE_RECORD 필드 | 설명 |
---|---|
RoundingMode Precision |
이러한 unsigned int 필드에는 예외가 발생한 시점의 부동 소수점 환경에 대한 정보가 포함됩니다. |
Operation |
이 unsigned int 필드는 트랩을 발생시킨 작업의 유형을 나타냅니다. 형식이 비교(_FpCodeCompare )인 경우 Result.Value 필드에 특수 _FPIEEE_COMPARE_RESULT 값(Fpieee.h에 정의된 대로) 중 하나를 제공할 수 있습니다. 변환 형식(_FpCodeConvert )은 부동 소수점 변환 작업을 수행하는 동안 트랩이 발생했음을 나타냅니다. Operand1 및Result 형식을 살펴보면 시도되는 변환 형식을 확인할 수 있습니다. |
Operand1 Operand2 Result |
이러한 _FPIEEE_VALUE 구조체는 제안된 결과 및 피연산자의 형식과 값을 나타냅니다. 각 구조에는 다음 필드가 포함됩니다.OperandValid - 응답 값이 유효한지 여부를 나타내는 플래그입니다.Format - 해당 값의 데이터 형식입니다. 해당 값이 유효하지 않은 경우에도 형식 형식이 반환될 수 있습니다.Value - 결과 또는 피연산자 데이터 값입니다. |
Cause Enable Status |
_FPIEEE_EXCEPTION_FLAGS 에는 부동 소수점 예외의 각 형식에 대한 비트 필드가 포함되어 있습니다. 이러한 필드와 제공된 예외를 마스킹하는 데 사용되는 인수 사이에는 대응이 있습니다 _controlfp . 각 비트의 정확한 의미는 컨텍스트에 따라 달라집니다.Cause - 각 집합 비트는 발생한 특정 예외를 나타냅니다.Enable - 각 집합 비트는 특정 예외가 현재 마스크 해제되었음을 나타냅니다.Status - 각 집합 비트는 특정 예외가 현재 보류 중임을 나타내며, 여기에는 예외가 마스킹되었기 때문에 발생하지 않은 예외가 포함됩니다 _controlfp . |
사용할 수 없는 보류 중 예외는 해당 예외를 사용할 때 발생합니다. 이러한 예외는 예외 필터로 사용할 _fpieee_flt
때 정의되지 않은 동작을 초래할 수 있습니다. 항상 부동 소수점 예외를 사용하도록 설정하기 전에 호출 _clearfp
합니다.
요구 사항
함수 | 필수 헤더 |
---|---|
_fpieee_flt |
<fpieee.h> |
호환성에 대한 자세한 내용은 호환성을 참조하세요.
예시
// crt_fpieee.c
// This program demonstrates the implementation of
// a user-defined floating-point exception handler using the
// _fpieee_flt function.
#include <fpieee.h>
#include <excpt.h>
#include <float.h>
#include <stddef.h>
int fpieee_handler( _FPIEEE_RECORD * );
int fpieee_handler( _FPIEEE_RECORD *pieee )
{
// user-defined ieee trap handler routine:
// there is one handler for all
// IEEE exceptions
// Assume the user wants all invalid
// operations to return 0.
if ((pieee->Cause.InvalidOperation) &&
(pieee->Result.Format == _FpFormatFp32))
{
pieee->Result.Value.Fp32Value = 0.0F;
return EXCEPTION_CONTINUE_EXECUTION;
}
else
return EXCEPTION_EXECUTE_HANDLER;
}
#define _EXC_MASK \
_EM_UNDERFLOW + \
_EM_OVERFLOW + \
_EM_ZERODIVIDE + \
_EM_INEXACT
int main( void )
{
// ...
__try {
// unmask invalid operation exception
_controlfp_s(NULL, _EXC_MASK, _MCW_EM);
// code that may generate
// fp exceptions goes here
}
__except ( _fpieee_flt( GetExceptionCode(),
GetExceptionInformation(),
fpieee_handler ) ){
// code that gets control
// if fpieee_handler returns
// EXCEPTION_EXECUTE_HANDLER goes here
}
// ...
}
참고 항목
수학 및 부동 소수점 지원
_control87
, , _controlfp
__control87_2
_controlfp_s