我希望你可以帮忙解决一下。
我写了一个模板类来计算标准偏差:
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位小数。任何人都可以提出这个理由吗?我很难过!
答案 0 :(得分:16)
IEEE-754双精度值具有大约15个十进制数字的精度,因此只有当您的值达到数百亿时才会限制在五位小数位。
您最有可能看到的只是双打的默认输出格式,与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标准中的表89(在27.4.4.1 basic_ios constructors
中)显示调用basic_ios::init()
后的后置条件,它显示默认精度为6.在C ++ 11中,它表示同样的事情,仅在27.5.5.2 basic_ios constructors
下的表128中。