跳转到内容

matherr : 可修改的数学错误处理程序

#include <math.h>
int matherr(struct exception *e);
```### 描述
matherr 在数学库函数生成错误时被调用。您可以用自己的子例程替换 matherr 以自定义错误处理。自定义的 matherr 如果未能解决错误,必须返回 0;如果错误已解决,则返回非零值。
当 matherr 返回非零值时,不会打印错误消息,且 errno 的值不会被修改。您可以在自己的 matherr 中利用结构体 *e 中传递的信息来实现其中一种或两种行为。
这是异常结构体(定义在 `math.h' 中):
```text
struct exception {
int type;
char *name;
double arg1, arg2, retval;
int err;
};

异常结构体的成员具有以下含义:

type 发生的数学错误类型;编码错误类型的宏同样定义在 `math.h’ 中。

name 指向以空字符结尾的字符串的指针,该字符串保存了发生错误的数学库函数的名称。

arg1, arg2 导致错误的参数。

retval 错误返回值(调用函数将返回的值)。

err 如果被设置为非零值,这是赋给 errno 的新值。

定义在 `math.h’ 中的错误类型表示可能的数学错误,如下所示:

DOMAIN 参数不在函数的定义域内;例如 log(-1.0)。

SING 请求的计算将导致奇点;例如 pow(0.0,-2.0)

OVERFLOW 计算将产生过大而无法表示的结果;例如 exp(1000.0)。

UNDERFLOW 计算将产生过小而无法表示的结果;例如 exp(-1000.0)。

TLOSS 精度完全丢失。结果将没有有效数字;例如 sin(10e70)。

PLOSS 精度部分丢失。### 返回值

matherr 的库定义在所有情况下都返回 0。您可以通过修改 e->retval 来从自定义的 matherr 中改变调用函数的结果,该值会传播回调用者。

如果 matherr 返回 0(表示它未能解决错误),调用者会将 errno 设置为适当的值,并打印一条错误消息。


权威来源: BUSMASTER DITA help source matherr.dita, compiled into BUSMASTER.CHM with the application.