Aracılığıyla paylaş


_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 ve errno 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 ve errno değişmeden kalır.

İade kodları hakkında daha fazla bilgi için bkz. errno, _doserrno, _sys_errlistve _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ı _matherrsağ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 Tanım
_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 arg1depolanı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

Ayrıca bkz.

Matematik ve kayan nokta desteği