FP16最大数量

时间:2019-06-24 16:32:42

标签: c++ floating-point eigen

当我查看以下代码时,我无法理解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在这里做什么?

2 个答案:

答案 0 :(得分:1)

该代码形成一个单精度浮点数的位表示,其值为65536.0。

在单精度格式中,低23位是尾数的小数部分,后8位是指数加127。所以(127 + 16) << 23代表数字1.0 * 2 16 < / sup> = 65536.0,比最大可能的半精度浮点数多一点。

答案 1 :(得分:1)

IEEE 754单精度二进制浮点数具有以下表示形式:

Example of a floating point number

在这里,指数是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 }}。

有趣的内容:

图片来自维基百科:Single-precision floating-point format