从学c语言就一直都知道浮点数有单精度双精度,后者精度较高,使用64位存储,前者使用32位。然而没有进一步了解过。这次看计算机专业导论,介绍了浮点数的内部存储规则,总结记录一下.

单精度和双精度

单精度为32位,第一位符号位,往后,前8位为指数位,尾数23位。 双精度为64位,第一位符号位,往后,前11位为指数位,尾数52位。

对尾数*1.1101*,默认第一位是1,但不存储, 不存储第一位1的原因是可以多一位的空间存储数据,增加精度(因为小数点右移了一位)。 所以对于小数$$-0.11101 \times 2^{-1001}$$先转换为$$-1.1101 \times2^{-1010}$$

0.11101 -> 1.11010 1110 1000 0000 0000 0000 000 -> 1101 0000 0000 0000 0000 000

对指数位,因为位数为8(假设使用单精度),所以取值范围 -2^7~(2^7-1)

实际上等同于取值0~(2^8-1)

所以只需要将指数加上2^7-1即可不使用符号位来表示负的指数(同样为了提高精度)。 所以指数*-0000 1010*加上0111 1111(即127) 即为最终指数位:*0111 0101*。

所以内存中实际保存的二进制为: ​
>1 0111 0101 1101 0000 0000 0000 0000 000

blog-float