首先,我要解决的问题是为始终保持均匀分布在范围内的值提出更好的表示:
0.0 <= x < 1.0
这样做的动机是尝试减少用于存储此数据的字节数(应用程序受大量内存和 I/O 带宽限制)。目前使用的是 32 位浮点表示,16 位浮点被证明不够准确。
我最初的想法是尝试将数据存储在 16 位整数中并简单地使用该方案:
x/(2^16 - 1) [x is an unsigned short]
为了保持算法大致相同并保持使用相同的浮点硬件操作(至少一开始),理想情况下,我希望继续将此小数表示转换为浮点表示,执行操作,然后转换回分数表示进行存储。
显然,在这两个完全不同的、不精确的表示之间来回会损失精度,但对于我们的应用程序,我怀疑这可能是一个可以接受的权衡。
我做了一些研究,看看目前有什么可能给我们一个很好的起点。开创性的“每个计算机科学家应该知道的关于浮点运算的知识”一文 ( http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html ) 让我看了其他一些文章, “超越浮点”(home.ccil.org/~cowan/temp/p319-clenshaw.pdf)就是这样一个例子。
谁能指出人们在其他地方使用的可能满足这些要求的其他表示示例?
我担心表示精确性的任何潜在收益(我们目前通过使用这个特定范围浪费了大部分浮点格式)将完全被从小数表示到浮点的四舍五入的要求所抵消-指向并再次返回。在这种情况下,可能需要直接使用这种小数表示进行算术运算才能从这种方法中获得任何好处。关于这一点的任何建议会有所帮助吗?