递归函数的数值精度

时间:2016-11-17 05:39:32

标签: c++ precision numerical

我很困惑,在评估以下函数时,它产生的数字直到F(0.8,172,1),但是当我将172增加到173时,结果变得无限。我怀疑存在数值精度问题?

double F(double d, int c, int t) {
    // base cases
    if ((c==1 && t==1) || (c==0 && t==0))
        return 1.;
    if (c==0 || t==0)
        return 0.;
    if (t>c)
        return 0.;
    return F(d,c-1,t-1) + (c-1 - t*d)*F(d,c-1,t);
}

1 个答案:

答案 0 :(得分:2)

我不知道你的函数应该做什么,但是根据参数:F(0.8, 172, 1),返回值是4.41861e+306,它只是double可以表示的最大值:

// 1.79769e+308
std::cout << std::numeric_limits<double>::max() << std::endl;

172替换为173时,返回值超出了double可以表示的最大值,并变为正无穷大。通过将F的返回类型更改为long double,可以明确这一点,从而产生值7.56466e+308