【问题标题】:Conversion of a number from Single precision floating point representation to a Half precision floating point将数字从单精度浮点表示转换为半精度浮点
【发布时间】:2011-11-17 18:54:42
【问题描述】:

我有一个代码,我必须处理 Half precision floating point representation 数字。为了实现这一点,我创建了我自己的 C++ 类 fp16,其中与此类型相关的所有运算符(算术逻辑、关系)都使用我的自定义函数重载,同时使用带有半精度浮点数的 Single precision floating point 数字。

半精度浮点 = 1 个符号位,5 个指数位,10 个有效位 = 16 位

单精度浮点 = 1 个符号位,8 个指数位,23 个有效位 = 32 位

那么我如何将单精度浮点数转换为半精度浮点数:-

对于有效位 - 我使用截断,即从 32 位中松散 13 位以获得半精度浮点数的 10 位有效位。

我应该怎么做才能处理指数位。如何从 8 个指数位变为 5 个指数位?

任何好的阅读材料都会有所帮助。

【问题讨论】:

  • 如果指数不能用 5 位表示,那么您处于溢出状态。如果您使用类似 IEEE754 的表示,您可能希望给出 inf 作为结果。我认为所有关于double->float 转换的阅读都是相关的。
  • (哦,你有没有注意到关于半精度引用 c/c++ code (for matlab) 的维基百科文章可以双向进行转换?这可能是一个很好的灵感。)
  • @eudoxos - 感谢 MAtlab 链接。它很好地解释了可以做什么。

标签: floating-point precision


【解决方案1】:

我在OpenEXR 开发的库中找到了解决方案。基本上有两种选择 OpenEXR 在下面使用此选项 a) - a) 使用 16 位无符号短类型来存储半精度浮点数据类型,它有一个预计算值的查找表存储,用于将浮点数转换为半数,也可以将半数转换为浮点数。

我是这样用的—— b)我可以放松单精度浮点数的精度以获得半精度浮点数。将此存储在“浮动”本机类型中。保持指数不变,因为我们仍然使用浮点(单精度)来存储降低精度的半精度浮点数据。

感谢 @eudoxos 提供的 Matlab 链接,解释了整个事情的一些细节。

【讨论】:

    猜你喜欢
    • 2020-02-03
    • 2013-04-16
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多