我有一个代码,我必须处理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 :(得分:1)
我在OpenEXR开发的库中找到了一个解决方案。基本上有两种选择 OpenEXR使用此选项a)以下 - a)使用16位无符号短类型存储半精度浮点数据类型,它有一个预计算值的查找表存储,用于将浮点数转换为一半,另一半转换为浮点数。
我用这种方式 - b)我可以放松单精度浮点数的精度来获得半精度浮点数。将其存储在“float”本机类型中。保持指数不变,因为我们仍然使用float(单精度)来存储精度降低的半精度浮点数据。
感谢@eudoxos的Matlab链接,解释了有关这一切的一些细节。