混血王子 发表于 2018-1-29 13:29

如何理解c语言实型精度(新同学必看)

      很高兴成为 吾爱会员,发一个简单但对新手有理解作用的帖子。
       在学习变量及其类型时,我们会接触到重要的实型变量,即单精度(float)双精度(double).
       为什么会有"精度"一词?让我们看一段代码。
   
   #include<stdio.h>
int main()
{
        double a=0;
        for(;a!=1;a+=0.1)
        {
                printf("%f\n",a);
        }
        return 0;
}
    运行结果会是什么?
      0.000000
      0.100000
      0.200000
      0.300000
      0.400000
      0.500000
      0.600000
      0.700000
      0.800000
      0.900000
大部分人心中是这个答案,其实不然。
这个程序不会停止,会一直打印下去。
因为a不会等于1.
   

实型数据与整形数据的存储方式不同,实型数据是按指数形式存储的。系统把一个实型数据分成小数部分和指数部分,分别存放。
   列如:16.235=1.0146875*2^4
(第一次发帖)图片上传不上来   分3部分储存+(符号).0146875(尾数部分)4(指数部分)

   

   当小数部分过长,存储空间不足,就会截掉后面的部分,从而存储的只是约数。
   我们让留小数30位,再看看
#include<stdio.h>
int main()
{
        double a=0;
        for(;a<1.1;a+=0.1)
        {
                printf("%0.30f\n",a);
        }
        return 0;
}

   代码自己运行 可以看到
0.000000000000000000000000000000
0.100000000000000010000000000000
0.200000000000000010000000000000
0.300000000000000040000000000000
0.400000000000000020000000000000
0.500000000000000000000000000000
0.599999999999999980000000000000
0.699999999999999960000000000000
0.799999999999999930000000000000
0.899999999999999910000000000000
0.999999999999999890000000000000   
1.099999999999999900000000000000
Press any key to continue
   
其中并没有1. 所以成语并不会停下来。


初来乍到,多多指教。

   


                                                         

混血王子 发表于 2018-1-29 13:32

是程序不会停下来,,打成成语了,抱歉

huste 发表于 2018-1-29 13:50

谢谢楼主分享

maqingyao 发表于 2018-1-29 14:16

其实就是计算机,把不同数据类型,以不同的方式存储。。

SeriousSnow 发表于 2018-1-29 14:31

1.00.1都改成0.5的倍数就能停下来

疯了算了 发表于 2018-1-29 16:01

习惯留名~
谢楼主分享

kk1212 发表于 2018-1-29 19:00

楼主讲的好 ,这样好理解

dngzdly 发表于 2018-1-29 23:42

支持,学习了。
页: [1]
查看完整版本: 如何理解c语言实型精度(新同学必看)