_matherr

数学错误处理。

int _matherr( 
   struct _exception *except  
);

参数

  • except
    指向包含消息信息的结构的指针。

返回值

matherr 返回0表示错误或返回非零值表示成功。 如果_matherr 返回 0,错误消息可能显示,并且 errno 设置为适当的错误值。 如果_matherr 返回一个非零值,错误消息不会显示,并且不更改 errno

有关这些属性和其他的更多信息返回代码示例,请参见 _doserrno、errno、_sys_errlist 和 _sys_nerr

备注

数学库的浮点函数生成_的matherr 函数处理错误。 这些函数调用_matherr,在检测到错误。

对于特定错误处理,可以提供的_matherr不同的定义。 如果使用 C 运行库 (Msvcr90.dll) 的动态链接的版本,则可以用用户定义的版本替换在客户端执行的默认matherr _例程。 但是,您不能替换在的 DLL Msvcr90.dll 客户端的默认 _matherr 实例。

当错误在算术例程时,matherr 调用_与 _exception 类型结构的指针 (定义在 Math.h) 作为参数。 该**_exception**结构包含以下元素:

  • int type
    异常类型。

  • char *name
    错误函数的名称。

  • double arg1arg2
    指向函数的第一个和第二个参数 (如果有)。

  • double retval
    由函数返回的值。

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

  • _DOMAIN
    域参数错误。

  • _SING
    奇点参数。

  • _OVERFLOW
    溢出范围错误都。

  • _PLOSS
    重要部分丢失。

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

  • _UNDERFLOW
    结果太小而无法表示。目前不支持此属性。

结构成员 name 是指向包含导致错误函数名的 null 终止的字符串。 结构成员 arg1arg2 指定导致错误值。(如果只有一个参数为,它在 arg1中。)

给定的默认返回值为 retval(V)。 如果更改返回值,所以必须指定错误是否实际发生了

要求

例程

必需的标头

_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。有关更多信息,请参见平台调用示例

请参见

参考

浮点支持

长双精度