网上看到这么个定义#define eps 1e-8 这是什么东西

来源:百度知道 编辑:UC知道 时间:2024/06/07 14:23:42
下面还有这么两句
#define zero(x) (((x)>0?(x):-(x)<eps)
#define _sign(x) ((x)>eps?1:((x)<-eps?2:0))
很难理解啊
......这个我还是知道的,我问的是1e-8是什么意思,-(x)<eps是什么意思

宏定义的部分一楼已经解释,这里不再赘述。
楼主想明白这个宏是什么意思,需要先了解一下小数是如何以浮点型(float)在计算机中表示的。这里省略,详细的可以自己百度一下。
浮点型数据的精度是有限的,用科学计数法表示一般能精确到小数点后面第6或7位。这里给你个例子,很简单:
#include<stdio.h>
int main()
{
float a;
a=1/3.0;
a=a*3.0-1;
printf("%f ",a);
if(a==0.0)
printf("is zero.\n");
else
printf("isnot zero.\n");
getchar();
return 0;
}
其实就是计算1/3.0*3.0-1的值,答案当然是0了。然而,在TC2.0中,执行结果如下:
0.000000 isnot zero.
是不是很奇怪结果为什么不是0?
这就是因为浮点型数据计算后保存结果只精确到小数点后第6、7位。而比较大小时却要比较更多的位数。如果你把上面例子的
printf("%f ",a);
改成
printf("%.8f ",a);
结果就成了
0.00000003 isnot zero.
发现问题症结了吧,小数点后第八位是3,而默认显示六位时是发现不了的。
(注意:不要图省事用a=1/3.0*3.0-1;代替a=1/3.0;a=a*3.0-1;。编译器不是傻X,它会把a=1/3.0*3.0-1;优化编译为a=1-1;,这样结果就变了。)
好了,问题已经发现了。那如何解决浮点型数据与0是否相等的比较呢?其实你可以认为从-0.000001到0.000001之间的浮点型数据就是0。
定义#define eps 1e-8就是用eps表示1e-8,即0.00000001。
#de