【问题标题】:An Alternative to Floating-Point for Storing Simple Fractional Values存储简单小数值的浮点替代方案
【发布时间】: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


【解决方案1】:

不要使用2^16-1。使用2^16。是的,您的精度会稍低一些并浪费您的0xFFFF,但您将保证在转换为浮点数时不会损失精度。 (相比之下,当从浮点转换时,你会损失 8 位的尾数精度。)

精度之间的往返转换可能会导致某些运算出现问题,尤其是逐步求和数字。如果可能,请将您的定点值视为“脏”,并且不要将它们用于进一步的浮点计算;更喜欢从输入重新计算而不是使用定点形式的中间结果。

或者,使用 24 位。使用这种表示形式,只要您的值不下溢(也就是说,只要它们高于 2^-24),您在任一方向上的精度都不会丢失。

【讨论】:

    【解决方案2】:

    1/x 不会在您的范围内分布不均吗? 1/2 1/3 1/4 ..你不想代表1/2以上的数字吗?

    这样的事情在Netcdf中做了很多来编码数据以节省空间。

    const double scale = 1.0/65536;
    unsigned short x;
    

    x 中的任何数字实际上都是 x*scale

    有关使用比例和偏移的更通用方法,请参阅 NetCDF 中的示例:http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/tutorial/NetcdfDataset.html

    【讨论】:

    • 是的,很抱歉,写下错误的表述。这听起来确实与我想要实现的目标完全一样。感谢您的链接。
    • 转换为无符号短:(无符号短)(f * 65536);转换自:f = x * scale;
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 2015-12-04
      • 2012-01-18
      • 2023-03-15
      • 1970-01-01
      • 2013-11-24
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多