_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 aerrno
je nastavená na odpovídající chybovou hodnotu. - Pokud
_matherr
vrátí nenulovou hodnotu, nezobrazí se žádná chybová zpráva aerrno
zůstane beze změny.
Další informace o návratových kódech naleznete v tématu errno
, _doserrno
, _sys_errlist
a _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 arg1
souboru .
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