关于浮点误差,1为何变成0.999999 ?

半世苍凉 提交于 2020-03-03 10:25:32

引言

之前在紫书里看到一些例题里 说要加上很小的实数,防止浮点误差造成结果错误。当时,我还不以为然,觉得为啥会出现误差???
然后,今天试了一下以下这段代码,用for循环将2不断减去0.000001(10的-6次方),直到等于1。

#include <iostream>
using namespace std;
int main() {
	double f;
	for (f = 2; f > 1; f -= 0.000001); //即1e-6, 1*10的-6次方 
	cout << f;	
	return 0;
} 

但是,最终得出来的结果并不是理所当然的 1 ,而是 0.999999。
图1-运行结果

为什么???

原因

查阅了一些资料,这又让我想起了万恶的《计算机组成原理》课,太深的解释我就不说了,上学期刚学的,但是并没理解多少,只懂了一点点,是一屁点。

关于浮点数,计算机存储的就是近似值,只能确保一定的有效位数,这与它的IEEE存放方式有关。然后,两个浮点数运算时,在对阶的时候,又会丢失一定的精度,最后导致误差。

我目前的理解是这样,若有错误,感谢指正!!!

手段

紫书中提到,有一种方法可以缓解这种情况,加上一个EPS后再输出(EPS通常取比最小精度还要小几个数量级的小实数)。例如,要求保留3位小数时EPS = 1e-6。

但是有时候会出现 “ 反作用 ”(如正确答案真的是0.499999),但是在实践中很好用(毕竟0.499999的情况比0.5要少很多)。——《算法竞赛入门经典》(刘汝佳)Page_95

我其实有疑惑,如果正确答案是0.499999,当题目要求保留三位小数时,加不加EPS (假设取1e-6),输出结果都是0.500(采用四舍五入)诶。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!