_matherr

Menangani kesalahan matematika.

Sintaks

int _matherr(struct _exception *except);

Parameter

except
Penunjuk ke struktur yang berisi informasi kesalahan.

Nilai hasil

_matherr mengembalikan 0 untuk menunjukkan kesalahan, atau nilai bukan nol untuk menunjukkan keberhasilan:

  • Jika _matherr mengembalikan 0, pesan kesalahan dapat ditampilkan dan errno diatur ke nilai kesalahan yang sesuai.
  • Jika _matherr mengembalikan nilai bukan nol, tidak ada pesan kesalahan yang ditampilkan, dan errno tetap tidak berubah.

Untuk informasi selengkapnya tentang kode pengembalian, lihat errno, , _doserrno_sys_errlist, dan _sys_nerr.

Keterangan

Fungsi memproses _matherr kesalahan yang dihasilkan oleh fungsi floating-point dari pustaka matematika. Fungsi-fungsi ini memanggil _matherr ketika kesalahan terdeteksi. Interaksi ini tidak terpengaruh oleh mode floating-point pengkompilasi atau kata kontrol titik mengambang. Karena _matherr merupakan fungsi pustaka, fungsi intrinsik matematika tidak akan menyebutnya.

Untuk penanganan kesalahan khusus, Anda dapat memberikan definisi yang berbeda dari _matherr. Jika Anda menggunakan versi pustaka run-time (CRT) yang ditautkan secara dinamis, Anda dapat mengganti rutinitas default _matherr dalam klien yang dapat dieksekusi dengan versi yang ditentukan pengguna. Namun, Anda tidak dapat mengganti rutinitas default _matherr di klien DLL CRT DLL.

Ketika kesalahan terjadi dalam rutinitas matematika, _matherr dipanggil dengan penunjuk ke _exception struktur jenis (didefinisikan dalam <math.h>) sebagai argumen. Struktur _exception berisi elemen-elemen berikut.

struct _exception
{
    int    type;   // exception type - see below
    char*  name;   // name of function where error occurred
    double arg1;   // first argument to function
    double arg2;   // second argument (if any) to function
    double retval; // value to be returned by function
};

Anggota type menentukan jenis kesalahan matematika. Ini adalah salah satu nilai berikut, yang didefinisikan dalam <math.h>:

Makro Deskripsi
_DOMAIN Kesalahan domain argumen
_SING Singularitas argumen
_OVERFLOW Kesalahan rentang luapan
_PLOSS Hilangnya signifikansi parsial
_TLOSS Total kehilangan signifikansi
_UNDERFLOW Hasilnya terlalu kecil untuk diwakili. (Kondisi ini saat ini tidak didukung.)

Anggota name struktur adalah penunjuk ke string null-terminated yang berisi nama fungsi yang menyebabkan kesalahan. Anggota arg1 struktur dan arg2 tentukan nilai yang menyebabkan kesalahan. Jika hanya satu argumen yang diberikan, argumen disimpan di arg1.

Nilai pengembalian default untuk kesalahan yang diberikan adalah retval. Jika Anda mengubah nilai pengembalian, nilai tersebut harus menentukan apakah kesalahan benar-benar terjadi.

Persyaratan

Rutin Header yang diperlukan
_matherr <math.h>

Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.

Contoh

/* crt_matherr.c
* Illustrates writing an error routine for math
* functions. 
* The error handling function must be named _matherr
*/

#include <math.h>
#include <string.h>
#include <stdio.h>

int main()
{
    /* Do several math operations that cause errors. The _matherr
     * routine handles _DOMAIN errors, but lets the system handle
     * other errors normally.
     */
    printf( "log( -2.0 ) = %e\n", log( -2.0 ) );
    printf( "log10( -5.0 ) = %e\n", log10( -5.0 ) );
    printf( "log( 0.0 ) = %e\n", log( 0.0 ) );
}

/* Handle several math errors caused by passing a negative argument
* to log or log10 (_DOMAIN errors). When this happens, _matherr
* returns the natural or base-10 logarithm of the absolute value
* of the argument and suppresses the usual error message.
*/
int _matherr(struct _exception *except)
{
    /* Handle _DOMAIN errors for log or log10. */
    if (except->type == _DOMAIN)
    {
        if (strcmp(except->name, "log") == 0)
        {
            except->retval = log(-(except->arg1));
            printf("Special: using absolute value: %s: _DOMAIN "
                     "error\n", except->name);
            return 1;
        }
        else if (strcmp(except->name, "log10") == 0)
        {
            except->retval = log10(-(except->arg1));
            printf("Special: using absolute value: %s: _DOMAIN "
                     "error\n", except->name);
            return 1;
        }
    }
    printf("Normal: ");
    return 0;    /* Else use the default actions */
}
Special: using absolute value: log: _DOMAIN error
log( -2.0 ) = 6.931472e-01
Special: using absolute value: log10: _DOMAIN error
log10( -5.0 ) = 6.989700e-01
Normal: log( 0.0 ) = -inf

Baca juga

Dukungan matematika dan titik mengambang