减少尾数位宽

Posted

技术标签:

【中文标题】减少尾数位宽【英文标题】:Reduce mantissa bit-width 【发布时间】:2013-10-17 15:38:52 【问题描述】:

好吧,我很尴尬,我自己不能得到这个,但是..我怎样才能减少尾数(和指数)位-with 表示浮点数?


我正在训练一个(卷积)人工神经网络(我正在 FPGA 上实现它),我想研究尾数(和指数)位宽与测试(和训练)精度之间的关系CPU(和 GPU)。下一步是将我的浮点数转换为定点表示(这就是我在 FPGA 上使用的),然后看看情况如何。

其他人已经做过类似的研究([Tong, Rutenbar and Nagle (1998)] 和 [Leeser and Zhao (2003)]),所以应该有一种方法可以做到这一点,尽管“如何”我还不清楚。

最后一点,我正在使用 Lua 进行编程,但我可以轻松地将 C 内容包含在 LuaJIT 的 ffi 中。

【问题讨论】:

【参考方案1】:

要从二进制浮点数 x 的有效位中删除 s 位并舍入剩余位,请使用 Veltkamp 算法:

Let factor = 2**s + 1.
Let c = factor * x.
Let y = c - (c-x).

上面的每个操作都应该用浮点算法计算,包括以与 x 相同的精度舍入到最近。那么y就是想要的结果。

请注意,这会将单个数字四舍五入为较短的有效位。它通常不会重现具有较短有效位的计算结果。例如,给定 ab,以更高的精度计算 ab 然后四舍五入到更小的精度不会总是与以最终精度计算 ab 的结果相同。

要减小指数范围,您只需将一个值与新指数范围的阈值进行比较,并根据需要声明下溢或上溢。

【讨论】:

非常感谢。这将是很好的考虑,因为现在我只是在点之后的特定位截断我的浮点数 (number:mul(2^b):floor():div(2^b))因为我们仍在使用静态定点数。明年我们可能会切换到动态定点,然后我将处理尾数:)

以上是关于减少尾数位宽的主要内容,如果未能解决你的问题,请参考以下文章

float和 double类型在java各是多少位啊

JVM之浮点数(float)表示

浮点数的存储与表达

宽字节注入

用尾递归减少函数的运算内存

BZOJ4513[Sdoi2016]储能表 数位DP