C++ 如何在小错误的情况下添加浮点数?

C++ 如何在小错误的情况下添加浮点数?,c++,floating-point,operating-system,C++,Floating Point,Operating System,有一个文件,文件中有10000个数字,如以下数字 7.474571938241547 5.9520387080950865 8.440712641801738 7.233918953859444 5.359040371183379 7.788831268552525 5.605003246355943 5.464119475471641 4.196570126808656 所以我需要将它们与float类型一起添加,但是当我按照原始顺序将它们添加到一起时,会有一定的误差。所以当我把它们按升序相加

有一个文件,文件中有10000个数字,如以下数字

7.474571938241547
5.9520387080950865
8.440712641801738
7.233918953859444
5.359040371183379
7.788831268552525
5.605003246355943
5.464119475471641
4.196570126808656
所以我需要将它们与float类型一起添加,但是当我按照原始顺序将它们添加到一起时,会有一定的误差。所以当我把它们按升序相加时,总和会变小。 当我按降序添加它们时,总和也会变小。将错误最小化的最佳方法是什么

  • 使用替身

  • 还可以使用堆对中间结果进行排序

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

    将总和重新插入堆中

  • 0+1+2

  • 如何在小错误的情况下添加浮点数

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


    使用有限精度算法的有效解决方案:对于所有用例,没有一种最佳算法。一个著名的浮点求和算法是,但对这个问题的研究是活跃的。

    使用双精度。。。它们是浮点运算的两倍。计算机上的浮点运算总是包含一些舍入误差,使用结果进行的算术运算越多,舍入误差就越大。一般来说,要获得更精确的结果,应将最小值(绝对值)与最大值(绝对值)相加。然而,只有当事情的规模大不相同时,这才有帮助。在您的情况下,事情在大小上非常相似,这并不重要,无论您以何种方式进行操作,都会得到一般的浮点错误。使用较大的类型(双精度?)或较大的精度浮点库:这是否回答了您的问题?如果需要无损精度,请使用某种可以添加数字字符串的BigNum或BCD,而不是
    float
    double