关于精度丢失问题
昨天晚上做到刘汝佳粉书的一道题,源代码如下:
#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)