2012-08-10 62 views
0

當代碼值很小時,我的代碼有效。 [a = 1,gos = 0.5,N = 1] & [a = 1,gos = 0.2,N = 2]。輸入爲高值時程序崩潰

但是,輸入更大的值時會崩潰。例如[a = 10,gos = 0.01,N = 18] & [a = 50,gos = 0.01,N = 64]。

我該如何解決?

下面的代碼:

#include <cstdlib> 
#include <iostream> 

using namespace std; 
double num_trunks(double A, double B, int N); 
double num_trunk_checker(double B, double gos, int N, double A); 

double num_trunks(double A, double B, int N) 
{ 
    double gos_prev = 1; 
    double gos; 
    int k = 1; 
    while (k != (N+1)) 
    { 
     gos = (A*gos_prev)/(k+(gos_prev)*A); 
     gos_prev = gos; 
     k++;  
    }; 
    num_trunk_checker(B,gos,N,A); 
} 

double num_trunk_checker(double B, double gos, int N, double A) 
{ 
    if (B != gos) 
    { 
     N = N + 1; 
     num_trunks(A,B,N); 
    } 
    else 
    { 
     cout << "Number of trunks: " << N << "\n"; 
    } 
} 

int main(int argc, char *argv[]) 
{ 

    double A, gos; 
    int N = 1; 
    cout << "A: "; 
    cin >> A; 
    cout << "gos: "; 
    cin >> gos; 
    num_trunks(A,gos,N); 

system("PAUSE"); 
return EXIT_SUCCESS; 
} 
+1

崩潰意味着??? – SiB 2012-08-10 15:15:33

+1

你的調試器指向哪一行? – Flexo 2012-08-10 15:17:49

+0

程序執行後停止工作。 – Afungus 2012-08-10 15:17:53

回答

2

num_trunks(A, B, N),你計算gos值,然後調用num_trunk_checker(B, gos, N, A)。但在num_trunk_checker中,如果Bgos不符,請轉過頭,並致電num_trunks(A, B, N+1)。所以唯一改變的是更大的N,如果gos永遠不等於B,那麼您將獲得無限遞歸。

num_trunks(A, B, N) 
    calculuate gos (which has to be less than 1) 
    num_trunk_checker(B, gos, N, A) 

num_trunk_checker(B, gos, N, A) 
    if (B != gos) num_trunks(A, B, N+1) 

這是可能的gos邁過的B價值,所以你永遠不會平等。

你的意思也許是什麼:

if (gos > B) //... 
+0

我將該行改爲if(abs(B-gos)> 0.0001),但它仍然崩潰。 – Afungus 2012-08-10 15:49:46

+0

@Afungus:你可能想從''想'fabs',但那不是我的建議。但是,是的,如果你想測試平等,那通常是這樣做的。我的建議是'if(gos> B)'。 – jxh 2012-08-10 15:54:18

0

沒有更多的信息(什麼崩潰多久時間??)這是不可能完全解決您的問題。但是可以做出一些合理的猜測。

浮點比較不完全準確,通常通過減去兩個值並與小值(稱爲epsilon)進行比較來完成。在檢查(B!= gos)時,可能會更好,做一些事情(B - gos < .00001)。沒有這個,計算可能不會終止;如果沒有,遞歸會無限期地繼續下去,直到堆棧溢出並且程序崩潰。

另一種可能性(我沒有運行程序來查看我自己會發生什麼)是,如果值較大,乘法會導致它們溢出(超過可以用double表示的最大可能值),從而導致異常被拋出。

+0

應該是abs(B-gos) – Gir 2012-08-10 15:33:44

+0

或更好......就像晶圓廠(B-gos)<1.e-6 – 2012-08-10 15:36:18