_matherr
Matematik hatalarını işler.
Sözdizimi
int _matherr(struct _exception *except);
Parametreler
except
Hata bilgilerini içeren yapıya yönelik işaretçi.
Dönüş değeri
_matherr
hata belirtmek için 0 veya başarıyı göstermek için sıfır olmayan bir değer döndürür:
- 0 döndürürse
_matherr
, bir hata iletisi görüntülenebilir veerrno
uygun bir hata değerine ayarlanır. - Sıfır olmayan bir değer döndürürse
_matherr
, hiçbir hata iletisi görüntülenmez veerrno
değişmeden kalır.
İade kodları hakkında daha fazla bilgi için bkz. errno
, _doserrno
, _sys_errlist
ve _sys_nerr
.
Açıklamalar
İşlev, _matherr
matematik kitaplığının kayan nokta işlevleri tarafından oluşturulan hataları işler. Bir hata algılandığında bu işlevler çağrılır _matherr
. Bu etkileşim, derleyicinin kayan nokta modundan veya kayan nokta denetim sözcüğünden etkilenmez. Bir _matherr
kitaplık işlevi olduğundan, matematik iç işlevleri bunu çağırmaz.
Özel hata işleme için farklı bir tanımı _matherr
sağlayabilirsiniz. C çalışma zamanı kitaplığının (CRT) dinamik olarak bağlı sürümünü kullanıyorsanız, istemci yürütülebilir dosyasındaki varsayılan _matherr
yordamı kullanıcı tanımlı bir sürümle değiştirebilirsiniz. Ancak, CRT DLL'nin DLL istemcisinde varsayılan _matherr
yordamı değiştiremezsiniz.
Matematik yordamında bir hata oluştuğunda, _matherr
bağımsız değişken olarak bir _exception
tür yapısına (içinde <math.h>
tanımlanan) bir işaretçiyle çağrılır. Yapı _exception
aşağıdaki öğeleri içerir.
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
};
Üye type
matematik hatasının türünü belirtir. bu, içinde <math.h>
tanımlanan aşağıdaki değerlerden biridir:
Makro | Açıklama |
---|---|
_DOMAIN |
Bağımsız değişken etki alanı hatası |
_SING |
Bağımsız değişken tekilliği |
_OVERFLOW |
Taşma aralığı hatası |
_PLOSS |
Kısmi anlam kaybı |
_TLOSS |
Toplam anlam kaybı |
_UNDERFLOW |
Sonuç, temsil edilemeyecek kadar küçük. (Bu koşul şu anda desteklenmiyor.) |
Yapı üyesi name
, hataya neden olan işlevin adını içeren null ile sonlandırılan bir dizenin işaretçisidir. Yapı üyeleri arg1
ve arg2
hataya neden olan değerleri belirtin. Yalnızca bir bağımsız değişken verilirse, içinde arg1
depolanır.
Verilen hata için varsayılan dönüş değeri olur retval
. Dönüş değerini değiştirirseniz, hatanın gerçekten oluşup oluşmadığını belirtmelidir.
Gereksinimler
Yordam | Gerekli başlık |
---|---|
_matherr |
<math.h> |
Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.
Örnek
/* 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