_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
    错误函数的名称。

  • 二进制 arg1arg2
    对函数的第一个和第二个 (如果有) 参数。

  • 二进制 retval
    函数将返回的值。

类型 指定数学错误类型。它是下列值之一,定义在 Math.h。

  • _DOMAIN
    参数 DOMAIN 错误。

  • _SING
    参数奇点。

  • _OVERFLOW
    溢出范围错误都。

  • _PLOSS
    重要性部分丢失。

  • _TLOSS
    发生全部有效位丢失。

  • _UNDERFLOW
    该结果太小而无法表示。(此情况当前不支持。)

结构成员 名称 是指向包含导致错误函数的名称以 NULL 结尾的字符串。结构成员 arg1arg2 指定导致该错误的值。(如果只给了一个参数,它在 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。有关更多信息,请参见 平台调用示例

请参见

参考

浮点支持

长的二进制文件