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


_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

Описание

unsigned int RoundingMode, unsigned int Precision

Эти поля содержат сведения о среде чисел с плавающей точкой в момент возникновения исключения.

unsigned int Operation

Указывает тип операции, вызвавшей ловушку. Если этот тип - сравнение (_FpCodeCompare), можно задать одно из специальных значений _FPIEEE_COMPARE_RESULT (как определено в Fpieee.h) в поле Result.Value. Тип преобразования (_FpCodeConvert) указывает на то, что ловушка произошла во время операции преобразования числа с плавающей точкой. Типы Operand1 и Result определяют тип этого преобразования.

_FPIEEE_VALUE Operand1, _FPIEEE_VALUE Operand2, _FPIEEE_VALUE Result

Эти структуры указывают типы и значения предполагаемого результата и операндов:

OperandValid   Флажок, указывающее, является ли значение допустимым.

Format   Тип данных соответствующего значения. Тип формата может быть возвращен, даже если соответствующее значение недопустимо.

Value   Значение данных результата или операнда.

_FPIEEE_EXCEPTION_FLAGS Cause, _FPIEEE_EXCEPTION_FLAGS Enable, _FPIEEE_EXCEPTION_FLAGS 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

   }

   // ...
}

Эквивалент в .NET Framework

Неприменимо. Для вызова стандартной функции C используйте PInvoke. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.

См. также

Ссылки

Поддержка чисел с плавающей запятой

_control87, _controlfp, __control87_2

_controlfp_s