输入为高值时程序崩溃

时间:2012-08-10 15:13:47

标签: c++ if-statement crash while-loop

我的代码在值很小时工作,例如[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;
} 

3 个答案:

答案 0 :(得分: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) //...

答案 1 :(得分:1)

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

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

然后试试......

if (fabs(B-gos)<1.e-6)
num_trunk_checker函数中的

答案 2 :(得分:0)

没有更多信息(什么崩溃?需要多长时间?)无法完美解决您的问题。但可以做出一些合理的猜测。

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

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