_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 danerrno
diatur ke nilai kesalahan yang sesuai. - Jika
_matherr
mengembalikan nilai bukan nol, tidak ada pesan kesalahan yang ditampilkan, danerrno
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