看到有网上有个项目是要求将浮点数用二进制表示出来,需要用IEEE754标准,查了查维基和深入理解计算机系统,重新学习了一遍浮点数在计算机中的表示和内存中的存储,
先简单的做个笔记,后面需要更深入的理解。
IEEE754定义了四种表示浮点数的方式:单精度(32bit),双精度(64bit),延伸单精度(43bit以上),延伸双精度(79bit以上),后两者很少使用,这里讲的是前面两种。
用二进制来表示浮点数分三个部分,以下都已32bit的单精度为例,双精度类似可以推算出来:
三部分为:符号位(sign)、指数(exponent)、尾数(significand,存储二进制小数部分),下面是维基上的图:
单精度浮点数中,sign为1bit,exponent为8bit,significand为23bit,三部分组成32bit。
还有一个概念比较重要“指数偏移值”,在IEEE754中指浮点数表示中的指数域(exponent)的编码值为指数的实际值加上一个固定值,这个固定值的算法是2e-1 - 1
在单精度浮点数中为128-1 = 127.
小数部分定义是f=0.fn-1fn-2...f0,二进制小数点在最高有效位的左边,而有小数定义为M=1 + f,所以M表示成1.fn-1...f0,通过调整指数,使有效数M在1~2之间
看一个例子8.25,
转换成二进制表示1000.01 可以表示成 1.00001 *23
所以指数E = 3 + 127 = 130
所以8.25在内存中表示是:
0 10000010 00001000000000000000000
其中对于小数部分如何转换成二进制,可以按一下方式小数部分*2,取整数部分值(0或者1)
,然后继续取结果的小数部分*2,在取整数部分,一直循环,直到取得想要的位数,
如0.25 *2 = 0.5, 整数部分为0,然后0.5*2=1.0,整数部分为1,所以二进制表示为0.0100000..00
指数的取值范围是从-126~127,所以当一个浮点数如0.25,时可以表示成1.000*2-2
所以指数偏移值为-2 + 127=125
在内存中表示是
0 01111101 00000000000000000000000
以上都是浮点表示中规格化值的用法,其他还有非规格化和特殊值两种,以后再补充。