金牌会员
 
- 积分
- 1369
- 金钱
- 1369
- 注册时间
- 2014-2-13
- 在线时间
- 169 小时
|

楼主 |
发表于 2016-3-18 13:00:07
|
显示全部楼层
本帖最后由 solo 于 2016-3-18 13:05 编辑
感觉大家也没深入考虑这个问题,我就把数据验算一下吧。
1、float数据转二进制源数据:11.4
float型数据32位长度: 符号 阶码 尾数
1位 8位 23位
①整数位转二进制
十进制:11
二进制:1011
②小数位转二进制
十进制:0.4
二进制:
0.4X2 = 0.8; 取0
0.8X2 = 1.6; 取1
0.6X2 = 1.2; 取1
0.2X2 = 0.4; 取0
0.4X2 = 0.8; 取0
0.8X2 = 1.6; 取1
0.6X2 = 1.2; 取1
0.2X2 = 0.4; 取0
.......
无限循环。。。只有出现0.5才能结束,可惜这种数据占少数。所以浮点型数据在计算机里的存储是有损存储。
③组合尾数
整数位+小数位(阶码只有23位,整数位全取,小数位截取)
1011. 0110 0110 0110 0110 0110
小数点左移3位:
1.011 0110 0110 0110 0110 0110
IEEE 754-2008默认最左边的“1”是缺省的,去掉最左边的1:
011 0110 0110 0110 0110 0110 (阶码)
④阶码
3+127 = 130;小数点左移的位数(3)+127
所以,阶码是:1000 0010
最后,11.4的存储格式:
二进制:
十六进制:
0x41 36 66 66
验证:
2、二进制数据转float
逆推的过程就不打了,我算出的结果是11.399993896484375,float的有效位数只有6~7位,所以最后的数据取11.39999。
以上说明11.4存入计算机的有损耗的,但是为啥printf打印出来的确实11.4呢?怀疑printf有进位处理。
|
|