2016-11-17 175 views
0

我很疑惑,在计算下面的函数时,它会产生数字直到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); 
} 
+2

您能否解释这是干什么的? – Mox

+1

我不认为这里存在精确问题。原因是因为double函数没有被用作此函数中任何位置的条件。也许真正的错误是在别的地方? – Mox

+2

http://floating-point-gui.de/formats/fp/所以你确实是对的,这是'双精度'数值精度的问题(从某种意义上讲,它是有限的 - 当然,你可以只放这么多数字转换为64位)。 – Ped7g

回答

2

我不知道你的函数是应该做的,但是给出的参数:F(0.8, 172, 1)返回值是4.41861e+306这只是短暂的最大值的double可以代表:

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

172被替换为173时,返回值超出a double可以表示的最大值并且变为正无穷大。这通过将F的返回类型更改为long double而得以明确,其结果为值7.56466e+308

+0

演示https://eval.in/679209它是在c中,但也适用于C++ – bansi

+0

@bansi,数字到目前为止,以至于我起初以为你指出了一个错误,然后我才意识到'7.56466 e + 308'就是那么大,哈哈。 'std :: cout'给出科学记数 – asimes

+0

'long double'不一定比'double'宽 –