本次实验机器window7和vs2008
浮点数存储的规定
浮点数的存储规定先要了解几个问题。一个浮点数四个字节,c语言默认输出%f是小数点后六位
上图范围是0-31的一张图。
首先红色区域范围是0-22,作用是存储十进制转成二进制后,经过科学计数法排序后,产生的23位小数
其次是绿色区域范围是23-30,作用是存储科学计数法中的指数。默认一开始是127.因为8位范围还要区分正负指数,必须要能加减。所以取范围的中间127。二进制表示就是01111111这是一开始绿色的值
最后蓝色区域范围是31,只有一位,主要区分这个浮点数的正负的,0代表正数,1代表负数。
接下来我们看一个例子体会一下这个存储
我要看浮点数6.24在内存中如何存储的
代码是
代码我们设置一个断点方便查看f的值
f的值
内存中存储的值 变量在内存中的值f打印出来的值(因为float默认打印出精度小数点后6位然后4舍五入了)
输出出来的值好了。我们开始研究怎么来的
首先先把6.24转换成2进制
二进制 110.0011110101110000101000111101011100001010001111011
我们能看到很长的一串。我们先将他转成科学计数法
1.100011110101110000101000111101011100001010001111011e2
因为使用了科学计数法小数点前面必定会有一个1所以存储的时候不存储这个1.就从小数点后开始数23位
23位数 10001111010111000010100 这个是红色区域的23位数
绿色区域默认是127。现在得加上指数2。现在是129用2进制表示就是10000001
蓝色区域,因为是正数就填0
然后我们把这个2进制拼接起来
01000000110001111010111000010100转成16进制40c7ae14
内存值我们这个是高位在前得结果,如果按照内存得低位在前 14aec740就和内存中是一样的。
现在我们已经知道如何存储了,但是他又是如何转换成小数得呢
我们拿出原来得23位小数 10001111010111000010100
这个是小数二进制转十进制和整数时一样得就是2得次方相加
2^-1+2^-5+2^-6+2^-7+2^-8+2^-10+2^-12+2^-13+2^-14+2^-19+2^-21
23位小数计算结果结果是0.559999942779541015625
这个结果是小数得还得加上内存不记录得二进制得1,转成10进制还是1所以加上1
1.559999942779541015625
现在这个结果还少了刚刚科学计数法中得,二进制得2次方。所以要给结果乘以4.
结果
转回去得值看到结果觉得不对?
结果是正确,那是因为精度得原因。我打印出小数点后10位得6.24f得值。结果是一样的
打印出小数点后10位这个问题。我一开始一直没想懂最后得第7位怎么来的。到后面经过百度,然后不要脸得问老师,换取老师得答案。
献给跟我一样有疑问的人,顺便做记录。
文章存在问题请发邮件至witwuming@foxmail.com
网友评论