浮点数陷阱

在《算法竞赛入门经典(第二版)》(紫书)的第二章,最后有一道思考题:

下面的程序运行结果是什么?提示:请上机实验,不要凭主观感觉回答。
#include
int main() {
	double i;
	for (i = 0; i != 10; i += 0.1)
		printf("%.1f\n", i);
	return 0;
}

实验发现程序会无限循环执行下去,即使把10换成10.0也没有用。

这是因为程序的浮点数陷阱

计算机的浮点数运算总会有误差(由“舍入”等引起),i自加0.1后并不是按照我们预想一样变成0.1,而是可能会变成0.100……01.
这就是造成i != 10这一条件永远成立的原因。

解决方法

  1. 循环条件变量应该是整形的。事实上它也没有理由应该是其他类型的,难道我们要循环0.5次吗?
  2. 在判断两个浮点数a和b是否相等时,不要用a==b,应该判断两者之差的绝对值fabs(a-b)是否小于某个阈值,例如1e-9。

你可能感兴趣的:(C++)