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

引言

之前在紫书里看到一些例题里 说要加上很小的实数,防止浮点误差造成结果错误。当时,我还不以为然,觉得为啥会出现误差???
然后,今天试了一下以下这段代码,用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(采用四舍五入)诶。

c++ 题目描述 奶牛 Bessie 回到学校了!她开始做她的数学作业,在作业中她被要求将正整数四舍五入到 10 10 的幂。 要将一个正整数 a a 四舍五入到最接近的 10 b 10 b ,其中 b b 为正整数,Bessie 首先找到从右往左数第 b b 个数位。令 x x 为这个数位。 如果 x ≥ 5 x≥5,Bessie 将 a a 增加 10 b 10 b 。 然后,Bessie 将从右侧开始直至第 b b 个数位的所有数位均设置为 0 0。 例如,如果 Bessie 想要将 456 456 四舍五入到最接近的 10 2 10 2 (百位),Bessie 会首先找到从右往左数第 2 2 个数位 5 5。这意味着 x = 5 x=5。然后由于 x ≥ 5 x≥5,Bessie 将 a a 增加 100 100。最后,Bessie 将 a a 中从右侧开始直至第 2 2 个数位的所有数位设置为 0 0,结果为 500 500。 但是,如果 Bessie 将 446 446 四舍五入到最接近的 10 2 10 2 ,她将得到 400 400。 在看了 Bessie 的作业后,Elsie 认为她已经发明了一种新的舍入方式:链式舍入。要链式舍入到最接近的 10 b 10 b ,Elsie 将首先舍入到最接近的 10 1 10 1 ,然后舍入到最接近的 10 2 10 2 ,以此类推,直至舍入到最接近的 10 b 10 b 。 Bessie 认为 Elsie 是错误的,但她太忙于数学作业,无法确认她的怀疑。她请你计算出存在多少个不小于 2 2 且不超过 N N 的整数 x x( 1 ≤ N ≤ 10 9 1≤N≤10 9 ),使得将 x x 四舍五入到最接近的 10 P 10 P 与链式舍入到最接近的 10 P 10 P 的结果不同,其中 P P 是满足 10 P ≥ x 10 P ≥x 的最小整数。 输入格式 你需要回答多个测试用例。 输入的第一行包含一个整数 T T( 1 ≤ T ≤ 10 5 1≤T≤10 5 ),为测试用例的数量。以下是 T T 个测试用例。 每个测试用例的输入仅有一行,包含一个整数 N N。输入保证同一测试点中的所有 N N 各不相同。 测试点性质 测试点 1:样例。 测试点 2-4: N ≤ 10 3 N≤10 3 。 测试点 5-7: N ≤ 10 6 N≤10 6 。 测试点 8-13:没有额外限制。
03-09
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值