2016-11-17 31 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
私はあなたの関数は、引数を行うことになったが、与えられているのか分からない

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

を:戻り値はdoubleが表現できる最大値のわずかである4.41861e+306あるF(0.8, 172, 1)172173に置き換えられた場合、戻り値はdoubleが表すことができる最大値を超えて正の無限大になります。返品タイプFlong doubleに変更すると、結果は値7.56466e+308

+0

デモhttps://eval.in/679209これはcですが、C++でも有効です – bansi

+0

@バンシィ、番号は最初に私が '7.56466を実現する前にバグを指摘していると思っていましたe + 308はちょうど大きい、ハハです。 'std :: cout'は科学的表記を与える – asimes

+0

' long double'は 'double'より必ずしも広いわけではありません –