计算涉及到的精度问题

关于精度丢失问题

昨天晚上做到刘汝佳粉书的一道题,源代码如下:

#include <stdio.h>
int main(void)
{
	double i;
	for(i = 0; i != 10; i += 0.1)
		printf("%.1f\n", i);
	return 0;
}

一开始我以为这就是简单的循环,到10就停了,然后却发现循环没有终结,陷入了死循环。
后来仔细思考了一下。发现了其中的缘由:

  • 计算机做加减法的时候用的是二进制作计算。
  • 十进制在转化成二进制的时候,整数部分没有误差,而小数部分却有,因为转化小数部分的时候用的是乘基取整法,有时候无法刚好乘完,必然会出现误差,这样的话每次加上去的就不是0.1(针对此题),而是在0.1上下波动(当然误差很小),这样就完美错过10这个数字了,从而陷入死循环。

另外附带一下单精度和双精度的区别。

  • 单精度(float)

  • 双精度(double)

posted @ 2018-03-08 12:34  jckcoenf  阅读(169)  评论(0编辑  收藏  举报