作业帮 > 综合 > 作业

C语言中for中浮点数精度的一个疑问

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/07/17 20:32:45
C语言中for中浮点数精度的一个疑问
double x = 1.0;
for( ; x < 11 ; x += 1.0) 》这个循环是可以结束.
double x =0.0;
for( ; x = 2.0; x += 0.2) 》这个循环是无限的.
书里的解释是:“0.2没有浮点数形式的二进制精确表示”.
1)double浮点数可以精确到小数后很多位.
2)“0.2没有浮点数形式”和“二进制精确”这两句话都无法看明白.
我猜,是不是就是因为double后面有太多位0,和0.2”不匹配“,所以x!=2.0这个条件无效,造成了没有结束条件,所以成了无限循环?
计算机存储浮点数时,是按IEEE754标准来存储的.简单说是以二进制科学计数法来存储的.
一个double型数据,在存储时,占8个字节,其存储格式为:符号位一位,指数位11位,尾数(小数)位52位,共计64位.
一个小数转换成二进制小数时,采用的是乘2取整法,如:0.2 =
0.2*2=0.4
0.4*2=0.8
0.8*2=1.6
0.6*2=1.2
0.2*2=0.4 到此开始循环,所以0.2=0.001100110011..
这是一个循环数,double的存储形式,导致不可能把这个循环小数全表示出来,因此不可能精确表示出0.2这个数!