【问题标题】:convert single precision floating point to half precision floating point将单精度浮点数转换为半精度浮点数
【发布时间】:2020-02-03 15:00:19
【问题描述】:

我正在努力使用 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上上传的文章,但都只是代码示例,并没有真正处理内部行为。

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

【问题讨论】:

  • 16位结果从何而来?
  • 请提供完整的引用和/或完整的引用,表明这是预期结果,包括有关使用哪种舍入模式的任何声明。
  • 是的,它们在我看来是有效的。
  • 该结果是否会是次规范/非规范化值?
  • 32 位浮点数的指数部分在0x1p-25 范围内,如果16 位浮点数的最小值是0x1p-24,为什么0 是最接近的可表示值?我错过了什么吗?

标签: c floating-point-conversion


【解决方案1】:

获得 -10 的偏置指数,您需要通过将尾数位右移 11 来创建一个非规格化数(在指数字段中为 0)。对于尾数位,您可以得到 00000 00000 11000...,然后将其四舍五入为 00000 00001 - 可能的最小 denorm 数。


一个 IEEE fp 数有一个 1 位符号、一个 n 位指数字段和一个 m 位尾数字段。对于 n 位指数字段,全 1 值表示 Inf 或 Nan,全 0 值表示 denorm 或零(取决于尾数位)。因此,只有 1..2n-2 范围内的指数对标准化数字有效。

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

-1S(1.0 + 2-mM)2E-偏差

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

-1S(0.0 + 2-mM)21-偏差

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

【讨论】:

  • 感谢您的帮助。实际上我不明白“通过将尾数位右移 11”。你能告诉我更详细的吗?此外,我们是否需要创建一个非规范化的数字,因为 -10 的有偏指数小于零?
  • 一个规范化的数字有一个(有偏的)指数在 1..2n-2 范围内——0 coed 是为非规范化数字(和 0)保留的。因此,如果您计算的有偏指数 >= 0,则无法生成规范化数字,而必须生成等数。
  • 谢谢您,先生,您对我来说不仅仅是教授。
  • 我问这个问题的原因是我正在制作一个将单精度浮点转换为半精度浮点的C程序。教授建议我使用联合,但实际上我几乎不明白联合如何帮助解决这个问题。因此,现在我正在尝试制作一种算法,该算法可以执行您告诉过的每一步(一步一步)。我可能不会直接向 stackoverflow 提出这个问题,因为可能有任何可能被处理为广泛的问题等。我可以问你一个想法,它可以为这个问题提供有效的问题解决算法吗?谢谢。
猜你喜欢
  • 2013-04-16
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
相关资源
最近更新 更多