【问题标题】:Using templates how can I calculate the average of x numbers?使用模板如何计算 x 数的平均值?
【发布时间】:2015-12-26 15:32:25
【问题描述】:

所以我有statistics.h这个

template<typename T>
class OwnType {
public:
    OwnType() {};
    virtual ~OwnType() {};

    void nextValue(T value) {
        nmbrCnt++;
        cout << "Value: " << value << endl;
        cout << "# of Values so far: " << nmbrCnt << endl;
        average = (average + value) / nmbrCnt; // calculate average <----- WRONG!

        variance += pow(value - average, 2) / nmbrCnt; // calculate standard variance/deviation
    };

    T getAverage() { return average; }
    T getVariance() { return variance; }
    T getRange() { return max - min; }

private:
    T max = NULL;
    T min = NULL;
    T average = NULL;
    double variance = 0;
    int nmbrCnt = 0;
    bool firstCall = true;
};

在 main.cpp 我这样做:

void main() {
    OwnType<double> list;

    list.nextValue(10.5);
        cout << "Average: " << list.getAverage() << endl;
    list.nextValue(5);
        cout << "Average: " << list.getAverage() << endl;
    list.nextValue(3);
        cout << "Average: " << list.getAverage() << endl;
    list.nextValue(24.6)
        cout << "Average: " << list.getAverage() << endl;
    }

但是,似乎存在逻辑错误,或者我对模板的理解不正确。我可以很好地计算平均值,如果它在一个数组中,但没有数组,没有任何存储,我很难过。有没有伊达?

【问题讨论】:

  • 具体问题是什么?模板看起来不错,虽然我不喜欢分配给NULL,而且方差的类型似乎是任意的。您需要帮助计算运行均值和标准差吗?
  • 与模板无关,只是你的公式有误,应该是average = ((nmbrCnt - 1) * average + value) / nmbrCnt;
  • 请注意,如果T 是整数类型,则公式将在整数算术中计算。你想要截断效果吗?事实上,为什么要使用模板呢?
  • 好的,谢谢。我的意思是公式。我的错。我认为是时候从 C++ 中休息几天了。为什么要使用模板?因为我想要,也因为我需要了解它们是如何工作的。我正在自学 C++。
  • 考虑将运行平均值和方差存储为 long double,即使 T 是浮点或整数类型。否则,看看当 T 为浮点数时,取 1、10 亿、负 10 亿的平均值时会发生什么。这也将防止整数截断。

标签: c++ math statistics


【解决方案1】:

您的运行均值和方差公式不正确。

我的 Monte Carlo 库中的一些代码可以帮助您:

 // Running variance calculation requires the previous value of the
 // mean so we do this one first.
 variance = path > 1 ? 
            (path - 1.0) / path * (variance + (mean - pv) * (mean - pv) / path) : 
             0.0;
 mean = ((path - 1.0) * mean + pv) / path;

这里,pv 是要添加的新值,path 是合并新值后分布中的值的数量。

如果T 是整数类型,那么请注意整数除法的截断效果。由于截断,您的运行均值和方差会恶化。

更好的是,完全放弃模板并使用double

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 2021-06-23
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多