_matherr

Obsługuje błędy matematyczne.

Składnia

int _matherr(struct _exception *except);

Parametry

except
Wskaźnik do struktury zawierającej informacje o błędzie.

Wartość zwracana

_matherr Zwraca wartość 0, aby wskazać błąd lub wartość niezerową, aby wskazać powodzenie:

  • Jeśli _matherr zwraca wartość 0, może zostać wyświetlony komunikat o błędzie i errno zostanie ustawiony na odpowiednią wartość błędu.
  • Jeśli _matherr zwraca wartość niezerową, nie jest wyświetlany żaden komunikat o błędzie i errno pozostaje niezmieniony.

Aby uzyskać więcej informacji na temat kodów zwracanych, zobacz errno, _doserrno, _sys_errlisti _sys_nerr.

Uwagi

Funkcja _matherr przetwarza błędy generowane przez funkcje zmiennoprzecinkowe biblioteki matematycznej. Te funkcje są wywoływane _matherr po wykryciu błędu. Ta interakcja nie ma wpływu na tryb zmiennoprzecinkowy kompilatora ani słowa sterującego zmiennoprzecinkowego. Ponieważ _matherr jest funkcją biblioteki, funkcje wewnętrzne matematyczne nie będą go wywoływać.

W przypadku specjalnej obsługi błędów można podać inną definicję ._matherr Jeśli używasz dynamicznie połączonej wersji biblioteki języka C (CRT), możesz zastąpić domyślną _matherr procedurę w pliku wykonywalnym klienta wersją zdefiniowaną przez użytkownika. Nie można jednak zastąpić domyślnej _matherr procedury w kliencie DLL biblioteki CRT DLL.

Gdy błąd występuje w procedurze matematycznej, _matherr jest wywoływany ze wskaźnikiem do _exception struktury typów (zdefiniowanej w <math.h>) jako argumentu. Struktura _exception zawiera następujące elementy.

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
};

Element type członkowski określa typ błędu matematycznego. Jest to jedna z następujących wartości zdefiniowanych w pliku <math.h>:

Macro opis
_DOMAIN Błąd domeny argumentu
_SING Liczba pojedynczych argumentów
_OVERFLOW Błąd zakresu przepełnienia
_PLOSS Częściowa utrata istotności
_TLOSS Łączna utrata istotności
_UNDERFLOW Wynik jest zbyt mały, aby być reprezentowany. (Ten warunek nie jest obecnie obsługiwany).

Element członkowski name struktury jest wskaźnikiem do ciągu zakończonego wartością null zawierającego nazwę funkcji, która spowodowała błąd. Elementy członkowskie arg1 struktury i arg2 określ wartości, które spowodowały błąd. Jeśli podano tylko jeden argument, jest on przechowywany w pliku arg1.

Domyślna wartość zwracana dla danego błędu to retval. Jeśli zmienisz wartość zwracaną, należy określić, czy błąd rzeczywiście wystąpił.

Wymagania

Procedura Wymagany nagłówek
_matherr <math.h>

Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.

Przykład

/* 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

Zobacz też

Obsługa obliczeń matematycznych i zmiennoprzecinkowych