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;
} 
4

3 回答 3

2

num_trunks(A, B, N)中,您计算​​一个gos值,然后调用num_trunk_checker(B, gos, N, A)。但在num_trunk_checker,如果B不匹配gos,你转身打电话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) //...
于 2012-08-10T15:27:53.633 回答
1

您应该阅读有关浮点比较的常见问题解答

http://www.parashift.com/c++-faq/floating-point-arith.html

然后尝试

if (fabs(B-gos)<1.e-6)

在 num_trunk_checker 函数中

于 2012-08-10T15:40:24.747 回答
0

如果没有更多信息(什么崩溃?需要多长时间?),就不可能完美地解决您的问题。但是可以做出一些合理的猜测。

浮点比较并不完全准确,通常通过将两个值相减并与一个较小的值(称为 epsilon)进行比较来完成。在检查 (B != gos) 时,执行类似 (B - gos < .00001) 的操作可能会更好。没有这个,计算可能不会终止;如果没有,递归将无限期地继续,直到堆栈溢出并且程序崩溃。

另一种可能性(我没有运行程序来查看自己会发生什么)是,对于较大的值,乘法会导致它们溢出(超过可以用双精度表示的最大可能值),从而导致抛出异常。

于 2012-08-10T15:31:05.723 回答