【问题标题】:How to add floating point numbers together with a small error?如何将浮点数加上一个小错误?
【发布时间】:2021-05-05 15:32:03
【问题描述】:

有一个文件,文件中有10000个类似以下数字的数字。

7.474571938241547
5.9520387080950865
8.440712641801738
7.233918953859444
5.359040371183379
7.788831268552525
5.605003246355943
5.464119475471641
4.196570126808656

所以我需要将它们与浮点类型一起添加,但是当我按照原始顺序将它们添加在一起时会有误差。因此,当我按升序添加它们时,总和会变小。 当我按降序添加它们时,总和也会变小。最小化错误的最佳方法是什么?

【问题讨论】:

  • 使用双精度...它们是浮点数的两倍
  • 计算机上的浮点运算总是会包含一些舍入误差,这些误差总是会复合(并变得更大)您使用结果执行的算术运算越多。
  • 一般来说,为了获得更准确的结果,您应该从最小到最大(的绝对值)相加。但是,只有在大小显着不同的情况下,这才会有所帮助。在您的情况下,事情的大小非常相似,这无关紧要,无论您采用哪种方式,您都会得到一般的浮点错误。使用更大的类型(双精度?)或更大精度的浮点库:en.wikipedia.org/wiki/…
  • 如果您需要无损精度,请使用某种可以添加数字字符串的 BigNum 或 BCD,而不是 floatdouble

标签: c++ floating-point operating-system


【解决方案1】:
  1. 使用双打

  2. Use Kahan summation

  3. 使用堆也对中间结果进行排序

    删除两个最小的元素(按绝对值)

    将总和插入堆中

  4. 0+1+2

【讨论】:

    【解决方案2】:

    浮点数加起来有小错误怎么办?

    具有最佳精度的简单解决方案:使用任意精度算术执行计算。如果需要,将输出转换为有限精度。

    使用有限精度算术的高效解决方案:没有一种最佳算法适用于所有用例。一个著名的浮点求和算法是Kahan summation algorithm,但该主题的研究很活跃。

    【讨论】:

      猜你喜欢
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多