Sdílet prostřednictvím


_fpieee_flt

Vyvolá obslužnou rutinu soutisku definovanou uživatelem pro výjimky s plovoucí desetinou čárkou IEEE.

Syntaxe

int _fpieee_flt(
   unsigned long excCode,
   struct _EXCEPTION_POINTERS *excInfo,
   int handler(_FPIEEE_RECORD *)
);

Parametry

excCode
Kód výjimky.

excInfo
Ukazatel na informační strukturu systém Windows NT výjimek.

handler
Ukazatel na rutinu obslužné rutiny IEEE IEEE.

Vrácená hodnota

Návratová _fpieee_flt hodnota je hodnota vrácená handlerhodnotou . Proto lze rutinu filtru IEEE použít v klauzuli s výjimkou mechanismu strukturovaného zpracování výjimek (SEH).

Poznámky

Funkce _fpieee_flt vyvolá obslužnou rutinu soutisku definovanou uživatelem pro výjimky s plovoucí desetinou čárkou IEEE a poskytne jí všechny relevantní informace. Tato rutina slouží jako filtr výjimek v mechanismu SEH, který v případě potřeby vyvolá vlastní obslužnou rutinu výjimky IEEE.

Struktura _FPIEEE_RECORD definovaná v Fpieee.h obsahuje informace týkající se výjimky s plovoucí desetinou čárkou IEEE. Tato struktura se předává obslužné rutině pasti definované uživatelem ._fpieee_flt

pole _FPIEEE_RECORD Popis
RoundingMode
Precision
Tato unsigned int pole obsahují informace o prostředí s plovoucí desetinou čárkou v době, kdy došlo k výjimce.
Operation Toto unsigned int pole označuje typ operace, která způsobila odchyt. Pokud je typ porovnání (_FpCodeCompare), můžete do pole Result.Value zadat jednu ze speciálních _FPIEEE_COMPARE_RESULT hodnot (jak je definováno v Fpieee.h). Typ převodu (_FpCodeConvert) označuje, že při operaci převodu s plovoucí desetinou čárkou došlo k depeše. Můžete se podívat na typy Operand1 a Result určit typ pokusu o převod.
Operand1
Operand2
Result
Tyto _FPIEEE_VALUE struktury označují typy a hodnoty navrhovaných výsledků a operandů. Každá struktura obsahuje tato pole:

OperandValid – Příznak označující, zda je hodnota odpovědi platná.
Format - Datový typ odpovídající hodnoty. Typ formátu může být vrácen i v případě, že odpovídající hodnota není platná.
Value - Výsledek nebo hodnota dat operandu.
Cause
Enable
Status
_FPIEEE_EXCEPTION_FLAGS obsahuje bitové pole pro každý typ výjimky s plovoucí desetinou čárkou. Mezi těmito poli a argumenty použitými k maskování výjimek zadaných do _controlfp. Přesný význam každého bitu závisí na kontextu:

Cause – Každý bit sady označuje konkrétní výjimku, která byla vyvolána.
Enable – Každý bit sady označuje, že konkrétní výjimka je aktuálně odmaskována.
Status - Každý bit sady označuje, že konkrétní výjimka je aktuálně čeká, což zahrnuje výjimky, které nebyly vyvolány, protože byly maskovány _controlfp.

Čekající výjimky, které jsou zakázány, jsou vyvolány, když je povolíte. Tyto výjimky můžou mít za následek nedefinované chování při použití _fpieee_flt jako filtru výjimky. Před povolením výjimek s plovoucí desetinou čárkou vždy volejte _clearfp .

Požadavky

Function Požadovaný hlavičkový soubor
_fpieee_flt <fpieee.h>

Další informace o kompatibilitě najdete v tématu Kompatibilita.

Příklad

// 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

   }

   // ...
}

Viz také

Podpora pro matematiku a plovoucí desetinou čárku
_control87, _controlfp, __control87_2
_controlfp_s