_fpieee_flt

Appelle un gestionnaire Interruptions défini par l'utilisateur pour des exceptions de virgule flottante IEEE.

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

Paramètres

  • excCode
    Code d'exception.

  • excInfo
    Pointeur à la structure d'informations sur les exceptions Windows NT.

  • handler
    Pointeur à la routine de gestionnaire Interruptions IEEE de l'utilisateur.

Valeur de retour

La valeur de retour de _fpieee_flt est la valeur renvoyée par handler. Ainsi, la routine de filtre IEEE peut être utilisée dans la clause d'un mécanisme de (SEH) de gestion structurée des exceptions.

Notes

La fonction _fpieee_flt appelle un gestionnaire d'interruptions défini par l'utilisateur pour des exceptions à virgule flottante IEEE et lui fournit toutes les informations pertinentes. Cette routine sert de filtre d'exceptions dans le mécanisme, qui appelle votre propre gestionnaire d'exceptions IEEE si nécessaire.

La structure _FPIEEE_RECORD, définie dans Fpieee.h, contient des informations concernant une exception à virgule flottante IEEE. Cette structure est passée au gestionnaire d'interruptions défini par l'utilisateur par _fpieee_flt.

champ de _FPIEEE_RECORD

Description

unsigned int RoundingMode, unsigned int Precision

Ces champs contiennent des informations sur l'environnement à virgule flottante survenant au moment où l'exception s'est produite.

unsigned int Operation

Indique le type d'opération qui a provoqué l'interruption. Si le type est une comparaison (_FpCodeCompare), vous pouvez fournir une des valeurs spéciales d'un _FPIEEE_COMPARE_RESULT (comme défini dans Fpieee.h) dans le champ Result.Value. Le type de conversion (_FpCodeConvert) indique que l'interruption s'est produite pendant une opération à virgule flottante de conversion. Regardez Operand1 et les types Result pour déterminer le type de conversion qui est tenté.

_FPIEEE_VALUE Operand1, _FPIEEE_VALUE Operand2, _FPIEEE_VALUE Result

Ces structures contiennent les types et les valeurs du résultat et des opérandes proposés :

OperandValid   Indicateur montrant si la valeur de réponse est valide.

Format   Type de données de la valeur correspondante. Type de format peut être retourné même si la valeur correspondante n'est pas valide.

Value   Valeur de données de résultat ou d'opérande.

_FPIEEE_EXCEPTION_FLAGS Cause, _FPIEEE_EXCEPTION_FLAGS Enable, _FPIEEE_EXCEPTION_FLAGS Status

_FPIEEE_EXCEPTION_FLAGS contient un champ de bits par type d'exception à virgule flottante.

Il existe une correspondance entre ces champs et les arguments utilisés pour masquer les exceptions fournies dans _controlfp.

La signification exacte de chaque bit dépend du contexte :

Cause   Chaque bit d'ensemble illustre l'exception particulière qui a été déclenchée.

Enable   Chaque bit d'ensemble indique que l'exception particulière est actuellement démasquée.

Status   Chaque bit d'ensemble indique que l'exception particulière est actuellement en attente. Cela inclut les exceptions qui n'étaient pas déclenchées car elles ont été masquées par _controlfp.

Les exceptions en attentes qui sont désactivé sont déclenchés lorsque vous l'extrayez. Cela peut entraîner un comportement non défini en utilisant _fpieee_flt comme filtre d'exceptions. Appelez toujours _clearfp avant d'extraire les exceptions à virgule flottante.

Configuration requise

Fonction

En-tête requis

_fpieee_flt

<fpieee.h>

Pour plus d'informations sur la compatibilité, consultez Compatibilité dans l'introduction.

Exemple

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

   }

   // ...
}

Équivalent .NET Framework

Non applicable. Pour appeler la fonction C standard, utilisez PInvoke. Pour plus d'informations, consultez Exemples d'appel de plateforme.

Voir aussi

Référence

Prise en charge de la virgule flottante

_control87, _controlfp, __control87_2

_controlfp_s