Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
_matherrzwraca wartość 0, może zostać wyświetlony komunikat o błędzie ierrnozostanie ustawiony na odpowiednią wartość błędu. - Jeśli
_matherrzwraca wartość niezerową, nie jest wyświetlany żaden komunikat o błędzie ierrnopozostaje 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>:
| Makro | 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