要点初见:二进制float取整数部分思路

1  结论

网上几乎查不到相应的公式.先上结论,根据IEEE 754 float类型的定义(注:并非所有float都是以IEEE 754标准进行存储,请谨慎甄别),F32数据 F 的二进制存储结构如下:

则F整数部分计算公式为:

(1 << (E - 127)) + (M >> (150 - E))

其中,

M =  F & 0x7FFFFF

E = | F | >> 23

2  原理推理

推理如下:

根据IEEE单精度浮点数的定义,对照上图的存储结构,其数值为

F = (-1)^{^{S}} \times (1.M) \times 2^{E - 127}

故:

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

先前忘记给移位计算加括号了……移位运算的优先级是不如四则运算的

猜你喜欢

转载自blog.csdn.net/m0_37857300/article/details/120908640