从单精度浮点表示转换为半精度浮点数

问题描述:

我有一个代码,我必须在Half precision floating point representation 数字上工作。为了达到这个目的,我创建了自己的C++类fp16,其中所有与这种类型相关的运算符(算术逻辑,关系)与我的自定义函数重载,同时使用带有半精度浮点数的Single precision floating point数字。从单精度浮点表示转换为半精度浮点数

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

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

所以我怎么做从单精度浮点数转换为半精度浮点数: -

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

我该如何处理指数位。我如何从8个指数位指向5个指数位?

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

+0

如果指数不能用5位表示,那么你处于溢出状态。如果你使用类似IEEE754的表示,你可能想要给出'inf'作为结果。我认为所有关于'double'->'float'转换的阅读都是相关的。 – eudoxos

+1

(并且,哦,你有没有注意到关于半精度参考[c/C++代码(用于matlab)]的*文章](http://www.mathworks.com/matlabcentral/fileexchange/23173)来做双向转换?这可能是一个很好的灵感。) – eudoxos

+0

@eudoxos - 感谢MAtlab链接。它很好地解释了可以做什么。 – goldenmean

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

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

感谢@eudoxos为Matlab链接解释了关于整个事情的一些细节。