_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. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.
См. также
Ссылки
Поддержка чисел с плавающей запятой