_fpieee_flt

Memanggil handler trap yang ditentukan pengguna untuk pengecualian titik mengambang IEEE.

Sintaks

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

Parameter

excCode
Kode pengecualian.

excInfo
Penunjuk ke struktur informasi pengecualian Windows NT.

handler
Arahkan ke rutinitas penangan jebakan IEEE pengguna.

Nilai hasil

Nilai yang dikembalikan adalah _fpieee_flt nilai yang dikembalikan oleh handler. Dengan demikian, rutinitas filter IEEE dapat digunakan dalam klausul pengecualian mekanisme penanganan pengecualian terstruktur (SEH).

Keterangan

Fungsi ini _fpieee_flt memanggil handler trap yang ditentukan pengguna untuk pengecualian titik mengambang IEEE dan menyediakannya dengan semua informasi yang relevan. Rutinitas ini berfungsi sebagai filter pengecualian dalam mekanisme SEH, yang memanggil handler pengecualian IEEE Anda sendiri jika diperlukan.

Struktur _FPIEEE_RECORD , yang didefinisikan dalam Fpieee.h, berisi informasi yang berkaitan dengan pengecualian titik mengambang IEEE. Struktur ini diteruskan ke handler trap yang ditentukan pengguna oleh _fpieee_flt.

bidang _FPIEEE_RECORD Deskripsi
RoundingMode
Precision
Bidang-bidang ini unsigned int berisi informasi tentang lingkungan floating-point pada saat pengecualian terjadi.
Operation Bidang ini unsigned int menunjukkan jenis operasi yang menyebabkan perangkap. Jika jenisnya adalah perbandingan (_FpCodeCompare), Anda dapat menyediakan salah satu nilai khusus _FPIEEE_COMPARE_RESULT (seperti yang didefinisikan dalam Fpieee.h) di bidang Result.Value . Jenis konversi (_FpCodeConvert) menunjukkan bahwa perangkap terjadi selama operasi konversi floating-point. Anda dapat melihat jenis dan Result untuk menentukan jenis konversi yang sedang dicobaOperand1.
Operand1
Operand2
Result
Struktur ini _FPIEEE_VALUE menunjukkan jenis dan nilai hasil dan operand yang diusulkan. Setiap struktur berisi bidang-bidang ini:

OperandValid - Bendera yang menunjukkan apakah nilai respons valid.
Format - Jenis data dari nilai yang sesuai. Jenis format mungkin dikembalikan meskipun nilai yang sesuai tidak valid.
Value - Nilai data hasil atau operand.
Cause
Enable
Status
_FPIEEE_EXCEPTION_FLAGS berisi bidang bit untuk setiap jenis pengecualian titik pecahan. Ada korespondensi antara bidang-bidang ini dan argumen yang digunakan untuk menutupi pengecualian yang disediakan ke _controlfp. Arti pasti dari setiap bit tergantung pada konteks:

Cause - Setiap bit yang ditetapkan menunjukkan pengecualian tertentu yang dimunculkan.
Enable - Setiap bit yang ditetapkan menunjukkan bahwa pengecualian tertentu saat ini dibuka kemasannya.
Status - Setiap bit yang ditetapkan menunjukkan bahwa pengecualian tertentu saat ini tertunda, yang mencakup pengecualian yang belum dinaikkan karena ditutupi oleh _controlfp.

Pengecualian tertunda yang dinonaktifkan dinaikkan saat Anda mengaktifkannya. Pengecualian ini dapat mengakibatkan perilaku yang tidak ditentukan saat menggunakan _fpieee_flt sebagai filter pengecualian. Selalu panggil _clearfp sebelum mengaktifkan pengecualian titik mengambang.

Persyaratan

Function Header yang diperlukan
_fpieee_flt <fpieee.h>

Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.

Contoh

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

   }

   // ...
}

Baca juga

Dukungan matematika dan titik mengambang
_control87, _controlfp, __control87_2
_controlfp_s