将Float32转换为Float16

时间:2020-05-25 23:21:38

标签: c++ c floating-point bit-manipulation half-precision-float

这是对https://stackoverflow.com/a/5587983/13586005的后续跟踪。 @sam hocevar或其他了解此信息的人:您能解释一下这里发生的事情吗?

tmp = (tmp - 0x70) & ((unsigned int)((int)(0x70 - tmp) >> 4) >> 27);

我不确定我是否会完全遵循它。我了解(tmp - 0x70)可以校正127-> 15的偏差,但是我不了解第二部分((unsigned int)((int)(0x70 - tmp) >> 4) >> 27),因此在最后一步中不了解经过校正的&的& 。谢谢!

1 个答案:

答案 0 :(得分:0)

(unsigned int)((int)(0x70 - tmp) >> 4) >> 27

等效于 1

(int)(0x70 - tmp) < 0 ? 0x1f : 0

但要保证不涉及分支-而是从提取结果中提取符号位,将其复制4次,然后降档以获取0x1f或0(取决于)。


1 在负号的有符号右移执行适当的算术移位的假设下-不是由C规范保证的,但是在大多数实现中都是常见的

相关问题