_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