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