Поделиться через


_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 может быть использована в выражении except механизма структурной обработки исключений (SEH).

Замечания

Функция _fpieee_flt вызывает определяемый пользователем обработчик исключений и прерываний для исключений IEEE с плавающей запятой и предоставляет ему всю требуемую информацию. Эта подпрограмма выполняет роль фильтра исключений в механизме SEH, который вызывает ваш собственные обработчик исключений IEEE в случае необходимости.

Структура _FPIEEE_RECORD, определенная в Fpieee.h, содержит сведения, относящиеся к исключениям IEEE с плавающей запятой. Эта структура передается функцией _fpieee_flt обработчику исключений и прерываний, определяемому пользователем.

Поле _FPIEEE_RECORD Description
RoundingMode
Precision
Эти unsigned int поля содержат сведения о среде с плавающей запятой во время возникновения исключения.
Operation Это unsigned int поле указывает тип операции, вызвавшей ловушку. Если тип является сравнением (_FpCodeCompare), можно указать одно из специальных _FPIEEE_COMPARE_RESULT значений (как определено в Fpieee.h) в поле Result.Value . Тип преобразования (_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 перед включением исключений с плавающей запятой.

Требования

Function Обязательный заголовок
_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