【发布时间】: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