我希望你可以帮助一点头脑.
我写了一个模板类来计算标准偏差:
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;
}
Run Code Online (Sandbox Code Playgroud)
这似乎正在做正确的事情,除了它将结果返回到只有5位小数.任何人都可以提出这个理由吗?我很难过!
pax*_*blo 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;
}
Run Code Online (Sandbox Code Playgroud)
其输出是:
1.23457
1.23456789012345
Run Code Online (Sandbox Code Playgroud)
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.