当我查看以下代码时,我无法理解127、16和23的来源?我知道127、16的位表示形式以及移位操作,但是无法将它们放在一起。
const FP32 f16max = { (127 + 16) << 23 };
这来自https://eigen.tuxfamily.org/dox/Half_8h_source.html
的358行我知道这意味着1.0:
0011 1111 1000 0000 0000 0000 0000 000
127必须是011 1111 1
,向左移23是要删除所有的尾数。这16在这里做什么?
答案 0 :(得分:1)
该代码形成一个单精度浮点数的位表示,其值为65536.0。
在单精度格式中,低23位是尾数的小数部分,后8位是指数加127。所以(127 + 16) << 23
代表数字1.0 * 2 16 < / sup> = 65536.0,比最大可能的半精度浮点数多一点。
答案 1 :(得分:1)
IEEE 754单精度二进制浮点数具有以下表示形式:
在这里,指数是0到255之间的8位无符号整数,偏差为127。或者,您可以说它是从-128到127的有符号整数。然后将该数字解码为:
(− 1) b 31 (1 + Sum( b 23−i < / sub> 2 - i ; i = 22…0))×2 e -127
您提到的行使用数据类型float32_bits
,其定义为:
union float32_bits {
unsigned int u;
float f;
};
因此,由于float32_bits
是一个联合,整数u
和浮点数f
占据相同的存储空间。这就是为什么当您将符号表示为:
const float32_bits f16max = { (127 + 16) << 23 };
您应该将其理解为为浮点数分配位模式。通过上面的解释,您可以看到127只是以上公式中的偏差补偿,而23则是将位移入浮点数的指数部分的移位。
因此变量f16max
将2 16 表示为浮点数f16max.f
,将143·2 23 表示为无符号整数{{1 }}。
有趣的内容: