原文链接:
http://blog.sina.com.cn/s/blog_603f3d660100jg63.html
VC++数学函数错误处理
数学错误常量有:
_DOMAIN:函数变量超过定义域;
_OVERFLOW:结果太大,返回类型难以表示;
_PLOSS:出现有效位部分丢失;
_SING:变量异常;函数参数有非法值;
_TLOSS:出现有效位全部丢失;
_UNDERFLOW:结果太小难以表示。
_matherr函数处理数学库的浮点函数产生的错误,这些函数出现错误时调用_matherr.
_matherr的原型: int _matherr(struct _exception *except )
_exception的结构包含以下成员变量:
int type 异常类型;
char *name出错函数名称
double arg1,arg2函数的第一个和第二个参量
double retval 函数的返回值
_matherr函数返回0,显示一个错误,并将errno置为适当的值,如果返回一个非0值,不显示错误消息,切保持errno不变。
下面举个例子:
#include <math.h>
#include <string.h>
#include <stdio.h>
void main()
{
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));
}
int _matherr(struct _exception *except )
{
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;
}
}
else
{
printf("Normal:");
return 0;//use default actions
}
}