为什么c ++ double会将自己限制在5位小数?

时间:2013-09-16 12:31:58

标签: c++ double

我希望你可以帮忙解决一下。

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

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位小数。任何人都可以提出这个理由吗?我很难过!

1 个答案:

答案 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中。