0

いくつかの if ステートメントを使用して単純な for ループを実行しています。この for ループでは、for ループのインデックス値に応じて 3 つの変数に値が与えられます。かなり単純に思えますが、コードを実行すると、値が常にゼロになり、なぜこれが起こっているのかわかりません。私の for ループを以下に示します。提案をいただければ幸いです。

double A [N+1];
double r;
double s;
double v;
for(int i = 2; i < N+1; i++)
{
    if(i == 2)
    {
         r = 1/2/i/(i-1);
         s = -1/2/(i*i - 1);
         v = 1/4/i/(i+1);
    }
    else if(i <= N-2 && i > 2)
    {
        r = 1/4/i/(i-1);
        s = -1/2/(i*i - 1);
        v = 1/4/i/(i+1);
    }
    else if(i <= N-4 && i > N-2)
    {
        r = 1/4/i/(i-1);
        s = 0;
        v = 1/4/i/(i+1);
    }
    else
    {
        r = 1/4/i/(i-1);
        s = 0;
        v = 0;
    }

    A[i] = r*F[i-2] + s*F[i] + v*F[i+2];
    cout << r << s << v << endl;

}
4

5 に答える 5

15

整数除算を使用しているために発生しています。例:

r = 1/2/i/(i-1);

これは次と同じです:

r = ((1 / 2) / i) / (i - 1);

これは次と同じです:

r = (0 / i) / (i - 1);

…これは次と同じです:

r = 0 / (i - 1);

…これは0

整数演算だから1 / 2です。0これを修正するには、浮動小数点値を使用します。

于 2012-12-04T12:27:20.263 に答える
4

三つのこと:

  1. else if(i <= N-4 && i > N-2)意味がない、その条件は成り立たない
  2. すべての除算は整数除算です。修正するには、数値の1つをdoubleに変換します。
  3. 1の結果として、i = N-1、i = Nの場合、最後の分岐が行われ、とにかく2つの変数を0に強制します。
于 2012-12-04T12:29:12.893 に答える
2

1、2、4は整数です。整数ランドでは1/2=0および1/4=0

于 2012-12-04T12:27:46.927 に答える
1

整数の場合、1/2 ゼロです。私は(最初に)定数をに変更して、それらがdoubleとして扱われるよう2にすることをお勧めします。2.0

iまた、完全を期すために、次のように、すべての変数を浮動小数点値にキャストすることもできます(必須ではない場合もあります) 。

r = 1.0 / 2.0 / (double)i / ((double)i - 1.0);

ダブルであるという事実rは、の右側で行われる計算にはまったく影響しません=。最後のビット(実際の割り当て)にのみ影響します。

于 2012-12-04T12:28:59.660 に答える
0

整数除算のため、1 / 2、1 / 4、および-1 / 2は常にゼロになります。したがって、1.0 / 2.0、1.0 / 4.0、および-1.0 / 2.0を試して、すばやく分類してください。ただし、基本に従って、コード内で多くのマジックナンバーを使用しないでください。それらの定数を作成して、を使用することを検討してください。

于 2012-12-04T12:31:02.450 に答える