Condividi tramite


_fpieee_flt

Richiama un gestore di trap definito dall'utente per le eccezioni a virgola mobile IEEE.

Sintassi

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

Parametri

excCode
Codice dell'eccezione.

excInfo
Puntatore a una struttura di informazioni sulle eccezioni di Windows NT.

handler
Puntatore alla routine del gestore di trap IEEE dell'utente.

Valore restituito

Il valore di ritorno di _fpieee_flt è il valore restituito da handler. Come tale, la routine di filtro IEEE può essere utilizzata nella clausola di eccezione di un meccanismo di gestione delle eccezioni strutturata (SEH).

Osservazioni:

La funzione _fpieee_flt richiama un gestore di trap definito dall'utente per le eccezioni a virgola mobile IEEE e fornisce tutte le informazioni rilevanti. Questa routine svolge la funzione di un filtro eccezioni nel meccanismo SEH, il quale richiama il proprio gestore delle eccezioni IEE quando necessario.

La struttura _FPIEEE_RECORD, definita in Fpieee.h, contiene informazioni relative a un'eccezione a virgola mobile IEEE. Questa struttura viene passata al gestore di trap definito dall'utente da _fpieee_flt.

Campo _FPIEEE_RECORD Descrizione
RoundingMode
Precision
Questi unsigned int campi contengono informazioni sull'ambiente a virgola mobile al momento in cui si è verificata l'eccezione.
Operation Questo unsigned int campo indica il tipo di operazione che ha causato la trap. Se il tipo è un confronto (_FpCodeCompare), è possibile specificare uno dei valori speciali _FPIEEE_COMPARE_RESULT (come definito in Fpieee.h) nel campo Result.Value . Il tipo di conversione (_FpCodeConvert) indica che il trap si è verificato durante un'operazione di conversione a virgola mobile. È possibile osservare i tipi Operand1 e Result per determinare il tipo di conversione tentata.
Operand1
Operand2
Result
Queste _FPIEEE_VALUE strutture indicano i tipi e i valori dei risultati e degli operandi proposti. Ogni struttura contiene questi campi:

OperandValid - Flag che indica se il valore di risposta è valido.
Format - Tipo di dati del valore corrispondente. Il tipo di formato potrebbe essere restituito anche se il valore corrispondente non è valido.
Value - Valore dei dati risultato o operando.
Cause
Enable
Status
_FPIEEE_EXCEPTION_FLAGS contiene un campo di bit per ogni tipo di eccezione a virgola mobile. Esiste una corrispondenza tra questi campi e gli argomenti usati per mascherare le eccezioni fornite a _controlfp. Il significato esatto di ogni bit dipende dal contesto:

Cause - Ogni bit set indica l'eccezione specifica generata.
Enable - Ogni bit set indica che l'eccezione specifica è attualmente non mascherata.
Status - Ogni bit set indica che l'eccezione specifica è attualmente in sospeso, che include eccezioni che non sono state generate perché sono state mascherate da _controlfp.

Le eccezioni in sospeso disabilitate vengono generate quando vengono abilitate. Queste eccezioni possono comportare un comportamento non definito quando si usa _fpieee_flt come filtro eccezioni. Chiamare _clearfp sempre prima di abilitare le eccezioni a virgola mobile.

Requisiti

Funzione Intestazione obbligatoria
_fpieee_flt <fpieee.h>

Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Esempio

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

   }

   // ...
}

Vedi anche

Supporto matematico e a virgola mobile
_control87, _controlfp, __control87_2
_controlfp_s