2012-08-10 91 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