如何理解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. 所以成语并不会停下来。
初来乍到,多多指教。
是程序不会停下来,,打成成语了,抱歉 谢谢楼主分享 其实就是计算机,把不同数据类型,以不同的方式存储。。 1.00.1都改成0.5的倍数就能停下来 习惯留名~
谢楼主分享 楼主讲的好 ,这样好理解 支持,学习了。
页:
[1]