_matherr
수학 오류를 처리합니다.
구문
int _matherr(struct _exception *except);
매개 변수
except
오류 정보를 포함하는 구조에 대한 포인터입니다.
반환 값
_matherr
는 0을 반환하여 오류를 나타내거나 성공을 나타내는 0이 아닌 값을 반환합니다.
- 0을 반환하면
_matherr
오류 메시지가 표시될 수 있으며errno
적절한 오류 값으로 설정됩니다. - 0이 아닌 값을 반환하는 경우
_matherr
오류 메시지가 표시되지 않고errno
변경되지 않은 상태로 유지됩니다.
반환 코드에 대한 자세한 내용은 , , 및 를 참조하세요errno
._sys_nerr
_sys_errlist
_doserrno
설명
이 함수는 _matherr
수학 라이브러리의 부동 소수점 함수에 의해 생성된 오류를 처리합니다. 이러한 함수는 오류가 검색될 때 호출 _matherr
됩니다. 이 상호 작용은 컴파일러의 부동 소수점 모드 또는 부동 소수점 제어 단어의 영향을 받지 않습니다. _matherr
라이브러리 함수이므로 수학 내장 함수는 이를 호출하지 않습니다.
특별한 오류 처리의 경우 다른 정의를 _matherr
제공할 수 있습니다. 동적으로 연결된 버전의 CRT(C 런타임 라이브러리)를 사용하는 경우 클라이언트 실행 파일의 기본 _matherr
루틴을 사용자 정의 버전으로 바꿀 수 있습니다. 그러나 CRT DLL의 DLL 클라이언트에서 기본 _matherr
루틴을 바꿀 수는 없습니다.
수학 루틴 _matherr
에서 오류가 발생하면 형식 구조(정의된)에 <math.h>
대한 포인터 _exception
를 인수로 사용하여 호출됩니다. 구조체에는 _exception
다음 요소가 포함됩니다.
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
};
멤버는 type
수학 오류의 유형을 지정합니다. 다음 값 중 하나로, 다음 값에 정의되어 있습니다.<math.h>
매크로 | 설명 |
---|---|
_DOMAIN |
인수 도메인 오류 |
_SING |
인수 특이점 |
_OVERFLOW |
오버플로 범위 오류 |
_PLOSS |
중요도 부분 손실 |
_TLOSS |
총 유의 손실 |
_UNDERFLOW |
결과가 너무 작아 나타낼 수 없습니다. (이 조건은 현재 지원되지 않습니다.) |
구조체 멤버 name
는 오류를 발생시킨 함수의 이름을 포함하는 null로 끝나는 문자열에 대한 포인터입니다. 구조체 멤버 arg1
이며 arg2
오류를 발생시킨 값을 지정합니다. 인수가 하나만 지정되면 에 저장됩니다 arg1
.
지정된 오류의 기본 반환 값은 .입니다 retval
. 반환 값을 변경하는 경우 오류가 실제로 발생했는지 여부를 해당 값이 지정해야 합니다.
요구 사항
루틴에서 반환된 값 | 필수 헤더 |
---|---|
_matherr |
<math.h> |
호환성에 대한 자세한 내용은 호환성을 참조하세요.
예시
/* 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