c++ - 高精度计算平均值的最佳策略

标签 c++ algorithm average average-precision

我正在比较两种计算随机数平均值的算法。

  • 第一个算法将所有数字相加并除以最后的项目数
  • 第二种算法计算每次迭代的平均值,并在收到新数据时重用结果

我想这里没有什么革命性的东西,而且我不是数学家,所以我不能为这两种算法命名。

这是我的代码:

#include <iostream>
#include <iomanip>
#include <cstdlib>

class Average1
{
public:
    Average1() : total( 0 ), count( 0 ) {}

    void add( double value )
    {
        total += value;
        count++;
    }

    double average()
    {
        return total/count;
    }

private:
    double total;
    size_t count;
};

class Average2
{
public:
    Average2() : av( 0 ), count( 0 ) {}

    void add( double value )
    {
        av = (av*count + value)/(count+1);
        count++;
    }

    double average()
    {
        return av;
    }

private:
    double av;
    size_t count;
};

void compare()
{
    Average1 av1;
    Average2 av2;
    double temp;
    for ( size_t i = 0; i != 100000000; ++i )
    {
        temp = static_cast<double>(std::rand()) / static_cast<double>(RAND_MAX);
        av1.add( temp );
        av2.add( temp );
    }

    std::cout << std::setprecision(20) << av1.average() << std::endl;
    std::cout << std::setprecision(20) << av2.average() << std::endl;
}

int main()
{
    compare();
    return 0;
}

输出是:

0.50001084285722707801
0.50001084285744978875

差异当然是由于 double 类型精度。

到底哪种方法好呢?哪一个给出了真实的数学平均值(或最接近...)?

最佳答案

如果你真的想要高精度:

编辑: math.fsum 中的 python 文档也链接到 this Overview of approaches

关于c++ - 高精度计算平均值的最佳策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37446257/

相关文章:

vb.net - 求解一次方程 - 代码优化

mysql - 平均使用MySQL的天数

java - 如何计算平均考试成绩

c++ - 用于放入在一组函数中传递的参数的结构

C++ MFC 按钮在窗口调整大小时消失

C++ 编译器错误 : ld: symbol(s) not found for member function referenced from _main

mysql - 如何从表中获取 count_id 和 rating_evarate?

c++ - 使用循环获取数字并将其列出(专长数组)

c++ - 使用 Boost::Geometry Polygon boolean/intersections 与线段属性

arrays - 查找数组的顶部和底部 5 个元素