CString str;
GetDlgItemText(IDC_EDIT1,str);
float f1=atof((CHAR *)(LPCSTR)(LPCTSTR)str);if (f1>=2.1)
MessageBox(L"yes",NULL,0);
else
MessageBox(L"no",NULL,0);奇怪的是当在编辑框IDC_EDIT1输入2.13时居然弹出的为“yes”!!怎么回事啊
GetDlgItemText(IDC_EDIT1,str);
float f1=atof((CHAR *)(LPCSTR)(LPCTSTR)str);if (f1>=2.1)
MessageBox(L"yes",NULL,0);
else
MessageBox(L"no",NULL,0);奇怪的是当在编辑框IDC_EDIT1输入2.13时居然弹出的为“yes”!!怎么回事啊
str="2.42";
float f1=atof((CHAR *)(LPCSTR)(LPCTSTR)str);
并不等同于
float f1=2.42
首先, epsilon是一个绝对的数据,也就是误差分析当中说说的绝对误差使用一个固定的数值,对于float类型可以表达的整个数域来说是不可以的比如epsilon取值为0.0001,而a和b的数值大小也是0.0001附近的,那么显然不合适另外对于a和b大小是10000这样的数据的时候,它也不合适,因为10000和10001也可以认为是相等的呢适合它的情况只是a或者b在1或者0附近的时候既然绝对误差不可以,那么自然的我们就会想到了相对误差
bool IsEqual(float a, float b, float relError ) {
return ( fabs ( (a-b)/a ) < relError ) ? true : false;
}
这样写还不完善,因为是拿固定的第一个参数做比较的,那么在调用IsEqual(a, b, relError ) 和 IsEqual(b, a, relError ) 的时候,可能得到不同的结果同时如果第一个参数是0的话,就有可能是除0溢出这个可以改造把除数选取为a和b当中绝对数值较大的即可
bool IsEqual(float a, float b, relError )
{
if (fabs(a)<fabs(b)) return ( fabs((a-b)/a) > relError ) ? true : false;
return (fabs( (a-b)/b) > relError ) ? true : false;
};
使用相对误差就很完善吗?也不是, 在某些特殊情况下, 相对误差也不能代表全部比如在判断空间三点是否共线的时候,使用判断点到另外两个点形成的线段的距离的方法的时候只用相对误差是不够的,应为线段距离可能很段,也可能很长,点到线段的距离,以及线段的长度做综合比较的时候,需要相对误差和绝对误差结合的方式才可以相对完整的比较算法应该如下:
bool IsEqual(float a, float b, float absError, float relError )
{
if (a==b) return true;
if (fabs(a-b)<absError ) return true;
if (fabs(a>b) return (fabs((a-b)/a>relError ) ? true : false;
return (fabs((a-b)/b>relError ) ? true : false;
}
这样才相对完整这仅仅是浮点数之间最初级的比较方法