1 结论
网上几乎查不到相应的公式.先上结论,根据IEEE 754 float类型的定义(注:并非所有float都是以IEEE 754标准进行存储,请谨慎甄别),F32数据 F 的二进制存储结构如下:
则F整数部分计算公式为:
(1 << (E - 127)) + (M >> (150 - E))
其中,
M = F & 0x7FFFFF
E = | F | >> 23
2 原理推理
推理如下:
根据IEEE单精度浮点数的定义,对照上图的存储结构,其数值为
故:
M为F与低23位为1,高9位为0的数的与,即M = F & 0x7FFFFF;
而F做绝对值后31位为0,则E为F的绝对值右移23位,即E = | F | >> 23;
考虑到上图单精度浮点数定义中M为1.M,要对1进行剥离,故F的整数部分为1的移位与剥离了1后的尾数部分移位的加和,二者都会受到(E - 127)的影响.故F的整数部分为
(1 << (E - 127)) + (M >> (23 - (E - 127)))
= (1 << (E - 127)) + (M >> (150 - E))
3 实例分析
举两个实际的例子:
3.1 118.5
float 118.5的IEEE二进制由高位至低位存储为
0100 0010 1110 1101 0000 0000 0000 0000
其中符号位S为0,即正数;
指数部分E为1000 0101,即133;
尾数部分M为110 1101 0000 0000 0000 0000,即7143424;
(1 << (E - 127)) + (M >> (150 - E))
= (1 << 6) + (7143424 >> 17)
= 64 + 54
= 118
3.2 20.59375
float 20.59375的IEEE二进制由高位至低位存储为
0100 0001 1010 0100 1100 0000 0000 0000
其中符号位S为0,即正数;
指数部分E为1000 0011,即131;
尾数部分M为010 0100 1100 0000 0000 0000,即2408448;
(1 << (E - 127)) + (M >> (150 - E))
= (1 << 4) + (2408448 >> 19)
= 16 + 4
= 20
先前忘记给移位计算加括号了……移位运算的优先级是不如四则运算的