一、浮点数在内存中的表示方式
IEEE 754标准规定:
类型 | 比特(位)数 |
---|---|
float | 32(4字节) |
double | 64(8字节) |
无论是单精度还是双精度在存储中都分为三个部分:
- 符号位(Sign) : 0代表正,1代表为负
- 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
- 尾数部分(Mantissa):尾数部分
float数据类型在内存中的存储形式如下图所示:
double数据类型在内存中的存储形式如下图所示:
二、由浮点数的二进制得到十进制实数的方法
float数据类型的计算方法:
double数据类型的计算方法:
简便的计算方法:
- float数据类型的计算方法:
real value = (-1)^sign * ( fraction/(2^23) + 1 ) * ( 2^(exponent-127) ) - double数据类型的计算方法:
real value = (-1)^sign * ( fraction/(2^52) + 1 ) * ( 2^(exponent-1023) )
代码示例(Lua):
-- a double-precision floating-point number
datas = {
0x76 ,0xFF ,0x43 ,0x52 ,0xF7 ,0xBE ,0x8B ,0x40 -- LSB first
,0x90 ,0x05 ,0x26 ,0x5D ,0xD6 ,0xD0 ,0x72 ,0x40
}
-- sign
sign = bit.rshift( bit.band(0x10,datas[8]),7 )
print(sign)
-- exponent
exponent = bit.lshift( bit.band(0x7F,datas[8]) , 4) + bit.rshift( bit.band(0xF0,datas[7]),4 ) -1023
print(exponent)
-- fraction
fraction = ( (bit.lshift(bit.band(datas[7],0x0f),16) + bit.lshift(datas[6],8) + datas[5]) * (2^32) ) +( bit.lshift(datas[4],24) + bit.lshift(datas[3],16) + bit.lshift(datas[2],8) + datas[1] )
print(fraction)
results = (-1)^sign * (fraction/(2^52) + 1) * (2^exponent)
print(results)