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場合は、向きを変えてを呼び出します。したがって、変更されたのはより大きなものだけであり、が等しくない場合は無限の再帰が得られます。Bgosnum_trunks(A, B, N+1)NgosB

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

浮動小数点比較に関する FAQ を読む必要があります

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

より多くの情報 (何がクラッシュするのか? どのくらいの時間がかかるのか?) がなければ、問題を完全に解決することは不可能です。しかし、いくつかの合理的な推測を行うことができます。

浮動小数点の比較は完全に正確というわけではなく、通常は 2 つの値を減算し、小さい値 (イプシロンと呼ばれる) と比較することによって行われます。(B != gos) をチェックするときは、(B - gos < .00001) のようにしたほうがよいかもしれません。これがないと、計算が終了しない場合があります。そうでない場合は、スタックがオーバーフローしてプログラムがクラッシュするまで、再帰が無期限に続行されます。

もう 1 つの可能性 (プログラムを実行して自分で何が起こるかを確認するわけではありません) は、値が大きくなると、乗算によって値がオーバーフローし (double で表現できる最大値を超える)、例外がスローされる可能性があります。

于 2012-08-10T15:31:05.723 に答える