(转)不可将浮点变量用“==”或“!=”与任何数字比较。
问:我想比较两个浮点型变量,应该怎么比较?
答:大于、小于直接比较啊。
等于最好这样:
const float E = 1e-6; float f1 , f2; //…… if(fabs(f1- f2) < E) {……}
----------------------------------------------------------------------------
不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度)。
..........................................................................................................................................................
好奇怪的循环问题
#includevoid main () { float percent; for (percent = 0.0; percent <= 1.0; percent += 0.1) printf("%3.1f/n", percent); }
上面这个循环运行10次
for (percent = 0; percent < =10; percent += 1) printf("%3.1f/n", percent);
改成整数后,就运行11次了
..........................................................................................................................................................
这是数据精度的问题,浮点数的比较一般不用==判断,而是比较差值是否大于1E-6甚至更高精度。
for (percent = 0.0; percent <= 1.0; percent += 0.1) printf("%3.1f/n", percent);
将%3.1改为%3.7f,或%3.8f甚至更多位,可以明显发现数据的值不是完全的0.0,0.1,0.2,0.3这样加0.1。我们认为的1.0在内存里是1.000000119(我是%3.9f时得出的),它大于1.0,不执行了,所以只执行10次了。
for (percent = 0.0; percent <= 2.0; percent += 0.1) printf("%3.9f/n", percent); //这时可以看到0到1.0的真实数据