【问题标题】:Converting Float32 to Float16将 Float32 转换为 Float16
【发布时间】:2020-09-12 16:08:03
【问题描述】:

这更像是对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),因此不理解最后一步中修正偏差的 &。谢谢!

【问题讨论】:

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


    【解决方案1】:
    (unsigned int)((int)(0x70 - tmp) >> 4) >> 27
    

    等价于1

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

    但保证不涉及分支——而是从提取结果中提取符号位,复制 4 次,然后降档以获得 0x1f 或 0,具体取决于。


    1假设负数的有符号右移会进行适当的算术移位——不受 C 规范保证,但在大多数实现中都很常见

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 2011-07-27
      • 2020-03-27
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 2016-06-14
      相关资源
      最近更新 更多