将单精度浮点转换为半精度浮点

时间:2019-10-05 17:00:55

标签: c floating-point-conversion

我正在努力用C将32位浮点转换为16位浮点。

我了解规范化,非规范化等概念。

但是我不明白下面的结果。

此转换符合IEEE 754标准。 (使用舍入到偶数模式)

32bit floating point
00110011 01000000 00000000 00000000 

converted 16bit floating point
00000000 00000001

这是我所采取的步骤。

给出32位浮点的符号位为0,exp字段为102,其余为小数位字段。

因此,exp字段102必须为-127偏差,因此它变为-25,并且如下所示。

// since exp field is not zero, there will be leading 1.
1.1000000 00000000 00000000 * 2^(-25)

在将上述数字转换为半精度浮点数时,我们必须对指数加上斜率(15)以对exp字段进行编码。

因此exp字段是-10。

由于编码的exp字段小于0,因此给定的32位浮点不能成功表示为半精度浮点。

所以我认为半精度浮点位模式将如下所示

00000000 00000000

但是为什么要00000000 00000001

我已经阅读了很多在stackoverflow上上传的文章,但是它们只是代码示例,实际上并没有处理内部行为。

有人可以反驳我的误解吗?

1 个答案:

答案 0 :(得分:3)

获得-10的有偏指数,您需要通过将尾数位右移11来创建非正规化的数字(指数字段中为0)。这将为您提供00000 00000 11000 ...的尾数位,然后将其舍入为00000 00001-最小的单位数。


IEEE fp编号具有1位符号,n位指数字段和m位尾数字段。对于n位指数字段,全1值表示Inf或Nan,全0值表示分母或零(取决于尾数位)。因此,只有在1..2 n -2范围内的指数才对归一化数字有效。

因此,当您计算“归一化和有偏的”指数时,如果它≤0,则需要生成一个分母(或零)。规范化数字的值为

-1 S (1.0 + 2 -m M)2 E-bias

(其中M是尾数字段中的值,被视为无符号整数,m是尾数位的数量-一些描述将其写为1.M)。分母的值为

-1 S (0.0 + 2 -m M)2 1-bias

也就是说,指数与偏置指数值1相同,但是“隐藏位”(添加到尾数顶部的额外位)被视为0而不是1。因此要转换您的指数为-10的标准化数字(偏)为分母,您需要将尾数(包括通常不存储的隐藏1位)移位1--10位(即11位)以获取尾数您想要的单位价值。由于这将始终移位至少一位(对于任何有偏差的指数≤0),因此它将0移到隐藏的位位置,匹配尾数的分母。如果指数足够小,它将完全移出尾数,为您提供0尾数(即零)。但是在您的特定情况下,即使它完全移出了10个位(以fp16格式表示),保护位仍然为1,因此四舍五入为1。