_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