我的代码在值很小时工作,例如[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;
}
答案 0 :(得分: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) //...
答案 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表示的最大可能值),从而导致异常被抛出。