4

我希望你能帮助一些令人头疼的问题。

我写了一个模板类来计算标准偏差:

template <class T>
double GetStandardDeviation(T* valueArray, int populationSize)
{
    double average;
    T cumulativeValue = 0;
    double cumulativeSquaredDeviation = 0;
    // calculate average
    for (int i = 0; i < populationSize; i++)
    {
        cumulativeValue += valueArray[i];
    }
    average = (double)cumulativeValue / (double)populationSize;
    // calculate S.D.
    for (int i = 0; i < populationSize; i++)
    {
        double difference = average - (double)valueArray[i];
        double squaredDifference = difference * difference;
        cumulativeSquaredDeviation += squaredDifference;
    }
    return cumulativeSquaredDeviation / (double)populationSize;

}

这似乎做的一切都是正确的,除了它只将结果返回到小数点后 5 位。任何人都可以提出一个理由吗?我难住了!

4

1 回答 1

17

IEEE-754 双精度值大约有 15 位小数精度,因此只有当您的值达到数百亿时,它才会被限制为 5 位小数。

您最有可能看到的只是双精度的默认输出格式,与 C 一样,它往往会为您提供有限数量的小数位数。

您可以在以下代码中看到这一点:

#include <iostream>
#include <iomanip>
int main(void) {
    double d = 1.23456789012345;
    std::cout << d << '\n';
    std::cout << std::setprecision(16) << d << '\n';
    return 0;
}

其输出为:

1.23457
1.23456789012345

C++03 标准 (in 27.4.4.1 basic_ios constructors) 中的表 89 显示了调用后的后置条件basic_ios::init(),它显示默认精度为 6。在 C++11 中,它表示相同的内容,仅在表 128 中27.5.5.2 basic_ios constructors

于 2013-09-16T12:39:38.830 回答