Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
_matherrmengembalikan 0, pesan kesalahan dapat ditampilkan danerrnodiatur ke nilai kesalahan yang sesuai. - Jika
_matherrmengembalikan nilai bukan nol, tidak ada pesan kesalahan yang ditampilkan, danerrnotetap 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