引言
之前在紫书里看到一些例题里 说要加上很小的实数,防止浮点误差造成结果错误。当时,我还不以为然,觉得为啥会出现误差???
然后,今天试了一下以下这段代码,用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。
为什么???
原因
查阅了一些资料,这又让我想起了万恶的《计算机组成原理》课,太深的解释我就不说了,上学期刚学的,但是并没理解多少,只懂了一点点,是一屁点。
关于浮点数,计算机存储的就是近似值,只能确保一定的有效位数,这与它的IEEE存放方式有关。然后,两个浮点数运算时,在对阶的时候,又会丢失一定的精度,最后导致误差。
我目前的理解是这样,若有错误,感谢指正!!!
手段
紫书中提到,有一种方法可以缓解这种情况,加上一个EPS后再输出(EPS通常取比最小精度还要小几个数量级的小实数)。例如,要求保留3位小数时EPS = 1e-6。
但是有时候会出现 “ 反作用 ”(如正确答案真的是0.499999),但是在实践中很好用(毕竟0.499999的情况比0.5要少很多)。——《算法竞赛入门经典》(刘汝佳)Page_95
我其实有疑惑,如果正确答案是0.499999,当题目要求保留三位小数时,加不加EPS (假设取1e-6),输出结果都是0.500(采用四舍五入)诶。
来源:CSDN
作者:reasonBao
链接:https://blog.csdn.net/qq_44296342/article/details/104625391