今天学习了课本上和视频上都学习了对于浮点数在内存中的表示,发现所用的方法不同,计算出来的结果也不同。以下用了两个例子来说明。
总结:float可表示的数字之间不是连续的,而是有间隙的。float是一种近似的表示方法,不能作为精确数使用
例子1:用两种方法表示 8.25的在内存中的存放形式(假定为float类型)
用课本的方法计算
0.825*(10^1) ,尾数部分**(0.825)10=(0.1110….)或者(0.1100….)**
重点:(这时并不能用二进制精确表示0.825,因为0.5+0.25=0.75,0.5+0.25+0.125=0.875)
指数部分 (1)10=(0000 0001)
最后 0 1110 0000 0000 0000 0000 000 0000 0001
0 111 0000 0000 0000 0000 0000 0000 0001
0x70000001
8.25的二进制表示为 1000.01 转换为 1.00001*(2^3)
其中:指数部分为3 加上偏移量127,最后为130。转换为2进制为 1000 0010
小数部分为00001
最后将符号位,指数部分和小数部分组合起来
0 1000 0010 00001
即为 0100 0001 000 001
末尾添0即为 0100 0001 0000 0100 0000 0000 0000 0000
用16进制表示,则为 0x41040000
例子2:计算68.75的float内存表示
课本方法:符号位(1位) + 尾数部分(23位)+阶码部分(8位)
68.75 = 0.6875*(10^2)
尾数a = (0.6875)10=(0.1011 0000 0000 0000 0000 000)
阶码(2)10=(0000 0010)2
0 1011 0000 0000 0000 0000 000 0000 0010
D.T视频上的方法:
(68.75)10 = (100 0100.11)2 可以转换为 1.00010011*(10^6)
指数部分为6 加上偏移量127,为133,二进制表示 1000 0101
小数部分为 00010011
结合起来 0 1000 0101 0001 0011 0000 0000 0000 000
与书本上计算出的不一致