浮点数转换为十进制
2015-11-25
浮点数二进制表达的三个组成部分 14.45*10^3,只不过这里是以2为底数
浮点数是科学计数法,在二进制中类似于
符号位 指数位 尾数
S E M
32位单精度浮点数 三部分的位数分别为
而64位双精度浮点数,指数部分为11位,尾数为52位。
三个部分的组成
- Sign(1bit):表示浮点数是正数还是负数。0表示正数,1表示负数
- Exponent(8bits):指数部分。类似于科学技术法中的
M*10^N
中的N,只不过这里是以2为底数而不是10。需要注意的是,这部分中是以2^7-1
即127
,也即01111111
代表2^0
,转换时需要根据127作偏移调整。 - Mantissa(23bits):基数部分。浮点数具体数值的实际表示。
转换过程
1.改写为二进制
整数部分,和小数部分分别改写,以5.2为例,整数部分为101,小数部分0.2 = 0.125+0.0625+0.007825+0.00390625
即2^-3+2^-4+2^-7+2^-8....
,也就是 .00110011001100110011
2.规格化
调整小数点,向右移或者向左移,保证小数点前面只有一个bit,且保证小数点前只为1,
规格化后为 1.0100110011001100110011* 2^2
3. 填充
指数部分是以127为偏移量的,相当于十进制中的0,将规格化后的指数部分加上127,就是浮点数的指数部分,129=10000001
注意,整数部分的1要舍去,因为在规格化后小数点前必然会有个1。
之后可以将该数转换为十六进制或者其他进制。
同样的,将一个二进制的浮点数转变成十进制,就是上述的逆过程,但要注意,去除符号位和指数后,将小数点偏移指数位减去127,再将剩下的二进制小数,转成十进制
附上一个浮点数转换工具:
http://www.h-schmidt.net/FloatConverter/IEEE754.html