_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)은 부동 소수점 변환 작업을 수행하는 동안 트랩이 발생했음을 나타냅니다. Operand1Result 형식을 살펴보면 시도되는 변환 형식을 확인할 수 있습니다.
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