_matherr
处理数学错误。
int _matherr(
struct _exception *except
);
参数
- 除了
到包含错误信息的结构的指针。
返回值
_matherr 返回 0 指示错误或非零值指示成功。如果 _matherr 返回 0; 错误消息中显示,并 errno 设置为一个适当的错误值。如果 _matherr 返回非零值,错误消息未显示,并 errno 不变。
有关的更多信息返回代码示例,请参见 _doserrno、 errno、 _sys_errlist 和 _sys_nerr。
备注
_matherr 功能数学库的浮点函数生成的处理错误。,在检测时,这些函数调用 _matherr 错误。
对于特定错误处理,可以提供 _matherr的不同定义。如果使用 C 运行库 (Msvcr90.dll) 的动态链接到的版本,可以使用一个用户定义的版本将在客户端可执行文件的默认 _matherr 实例。但是,您不能替换在 Msvcr90.dll 的 DLL 客户端的默认 _matherr 实例。
当错误在算术例程时生成, _matherr 调用与 _exception 类型结构的指针 (定义在 Math.h) 作为参数传递。_exception 结构包含以下元素。
int 类型
异常类型。字符 *name
错误函数的名称。二进制 arg1, arg2
对函数的第一个和第二个 (如果有) 参数。二进制 retval
函数将返回的值。
类型 指定数学错误类型。它是下列值之一,定义在 Math.h。
_DOMAIN
参数 DOMAIN 错误。_SING
参数奇点。_OVERFLOW
溢出范围错误都。_PLOSS
重要性部分丢失。_TLOSS
发生全部有效位丢失。_UNDERFLOW
该结果太小而无法表示。(此情况当前不支持。)
结构成员 名称 是指向包含导致错误函数的名称以 NULL 结尾的字符串。结构成员 arg1 和 arg2 指定导致该错误的值。(如果只给了一个参数,它在 arg1存储。)
默认值返回给定错误的值是 retval。如果更改返回一个值,则必须指定错误是否实际错误。
要求
实例 |
必需的头 |
---|---|
_matherr |
math.h |
有关更多兼容性信息,请参见中介绍的 兼容性 。
库
C 运行库的所有版本。
示例
// crt_matherr.c
/* illustrates writing an error routine for math
* functions. The error function must be:
* _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 */
}
Output
Special: using absolute value: log: _DOMAIN error
log( -2.0 ) = 6.931472e-001
Special: using absolute value: log10: _DOMAIN error
log10( -5.0 ) = 6.989700e-001
Normal: log( 0.0 ) = -1.#INF00e+000
.NET Framework 等效项
不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见 平台调用示例。