2016-11-17 77 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'寬 –