Sdílet prostřednictvím


_matherr

Zpracovává matematické chyby.

Syntaxe

int _matherr(struct _exception *except);

Parametry

except
Ukazatel na strukturu obsahující informace o chybách.

Vrácená hodnota

_matherr vrátí hodnotu 0 označující chybu nebo nenulovou hodnotu označující úspěch:

  • Pokud _matherr vrátí hodnotu 0, může se zobrazit chybová zpráva a errno je nastavená na odpovídající chybovou hodnotu.
  • Pokud _matherr vrátí nenulovou hodnotu, nezobrazí se žádná chybová zpráva a errno zůstane beze změny.

Další informace o návratových kódech naleznete v tématu errno, _doserrno, _sys_errlista _sys_nerr.

Poznámky

Funkce _matherr zpracovává chyby generované funkcemi s plovoucí desetinou čárkou matematické knihovny. Tyto funkce volají _matherr při zjištění chyby. Tato interakce nemá vliv na režim s plovoucí desetinou čárkou kompilátoru nebo ovládacího slova s plovoucí desetinou čárkou. Protože _matherr je funkce knihovny, matematické vnitřní funkce ji nebudou volat.

Pro speciální zpracování chyb můžete zadat jinou definici _matherr. Pokud používáte dynamicky propojenou verzi knihovny runtime jazyka C (CRT), můžete výchozí _matherr rutinu ve spustitelném souboru klienta nahradit uživatelem definovanou verzí. Nelze však nahradit výchozí _matherr rutinu v klientovi knihovny DLL knihovny DLL CRT.

Pokud v matematické rutině dojde k chybě, _matherr volá se ukazatel na strukturu typu (definovanou _exception v <math.h>) jako argument. Struktura _exception obsahuje následující prvky.

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

Člen type určuje typ matematické chyby. Je to jedna z následujících hodnot definovaných v <math.h>:

Makro Popis
_DOMAIN Chyba domény argumentu
_SING Jedinečnost argumentu
_OVERFLOW Chyba rozsahu přetečení
_PLOSS Částečná ztráta významnosti
_TLOSS Celková ztráta významnosti
_UNDERFLOW Výsledek je příliš malý, aby se reprezentoval. (Tato podmínka se v současné době nepodporuje.)

Člen name struktury je ukazatel na řetězec ukončený hodnotou null obsahující název funkce, která způsobila chybu. Členy struktury arg1 a arg2 zadejte hodnoty, které způsobily chybu. Pokud je zadaný pouze jeden argument, je uložen v arg1souboru .

Výchozí návratová hodnota pro danou chybu je retval. Pokud změníte návratovou hodnotu, musí určit, jestli došlo k chybě.

Požadavky

Rutina Požadovaný hlavičkový soubor
_matherr <math.h>

Další informace o kompatibilitě najdete v tématu Kompatibilita.

Příklad

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

Viz také

Podpora pro matematiku a plovoucí desetinou čárku