【发布时间】:2013-11-22 07:17:48
【问题描述】:
首先,我要解决的问题是为始终保持均匀分布在范围内的值提出更好的表示:
0.0 <= x < 1.0
这样做的动机是尝试减少用于存储此数据的字节数(应用程序受大量内存和 I/O 带宽限制)。目前使用的是 32 位浮点表示,事实证明 16 位浮点不够准确。
我最初的想法是尝试将数据存储在一个 16 位整数中并简单地使用该方案:
x/(2^16 - 1) [x is an unsigned short]
为了保持算法大致相同并保持使用相同的浮点硬件操作(至少一开始是这样),理想情况下,我希望继续将此小数表示转换为浮点表示,执行操作(s ),然后转换回分数表示进行存储。
显然,在这两种完全不同的、不精确的表示之间来回切换会损失精度,但对于我们的应用程序,我怀疑这可能是一个可以接受的折衷方案。
我已经做了一些研究,看看目前有什么可能会给我们一个很好的起点。开创性的“What Every Computer Scientist Should Know About Floating-Point Arithmetic”文章 (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) 让我看到了其他一些文章,“Beyond Floating Point”(home.ccil.org/~cowan/temp/p319-clenshaw.pdf) 就是这样一个例子。
谁能指出人们在其他地方使用的可能满足这些要求的其他表示示例?
我担心表示精确性的任何潜在收益(我们目前使用这个特定范围浪费了大部分浮点格式)将完全被从分数表示中舍入两次的要求所抵消到浮点并再次返回。在这种情况下,可能需要直接使用这种小数表示进行算术运算才能从这种方法中获得任何好处。关于这一点的任何建议会有所帮助吗?
【问题讨论】:
-
有一个关于这个的 ACCU 重载系列:accu.org/index.php/journals/1717
-
1/x的表示将无法满足您对均匀分布的要求。 -
听起来性能也是个问题,来回转换。
-
抱歉,写下完全错误的表示 - 应该是 x/(2^16 - 1)。那应该在正确的范围内均匀分布。我已经更新了帖子。
标签: c++ floating-point floating-accuracy fractions floating-point-conversion