递归函数中的数值精度
numerical precision in recursive functions
我很困惑,当计算下面的函数时它产生直到 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);
}
我不知道你的函数应该做什么,但是给定参数:F(0.8, 172, 1)
return 值是 4.41861e+306
,它刚好小于最大值 a double
可以表示:
// 1.79769e+308
std::cout << std::numeric_limits<double>::max() << std::endl;
当172
替换为173
时,return的值超过了double
所能表示的最大值,变为正无穷大。通过将 F
的 return 类型更改为 long double
可以明确这一点,这会导致值 7.56466e+308
我很困惑,当计算下面的函数时它产生直到 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);
}
我不知道你的函数应该做什么,但是给定参数:F(0.8, 172, 1)
return 值是 4.41861e+306
,它刚好小于最大值 a double
可以表示:
// 1.79769e+308
std::cout << std::numeric_limits<double>::max() << std::endl;
当172
替换为173
时,return的值超过了double
所能表示的最大值,变为正无穷大。通过将 F
的 return 类型更改为 long double
可以明确这一点,这会导致值 7.56466e+308