1

ANSI-Cでプログラムを書いています。

これらの値が与えられた場合:

static long long int QList[12] = { 0, 2, 6, 30, 210, 2310, 30030, 510510, 9699690, 223092870, 6469693230, 200560490130 };
static long long int phiList[12] = { 0, 1, 2, 8, 48, 480, 5760, 92160, 1658880, 36495360, 1021870080, 30656102400 };
static int hList[12] = { 0, 1, 2, 4, 12, 60, 60, 120, 360, 3960, 27720, 27720 };

私は次のようなループでそれらを使用します:

double alfa;
static double Log2 = log(2.);

for(k=3; k<8; k++){
    alfa = QList[k]/phiList[k]/ hList[k]/ Log2;
    [.........]
}

そう書くと、すべての "k" に対してアルファ = 0.0000000000000000000 となります。

代わりに、私が書くと:

double alfa;
static double Log2 = log(2.);

for(k=3; k<8; k++){
    alfa = QList[k];
    alfa= alfa/ phiList[k];
    alfa = alfa / hList[k];
    alfa = alfa / Log2;
    [.........]
}

Alfa は正しい値 (ゼロとは異なる) を想定しています。問題は「hList[k]」の分割にあるようです。

なんで?

4

1 に答える 1

4

除算は左から右に実行されるため、最初のケースでは最初の 2 つの除算に整数除算を使用し、残りを削除します。

次のようにキャストすることで、常に double を使用するように強制できますdouble

alfa = ((double)QList[k])/phiList[k]/ hList[k]/ Log2;
于 2013-11-13T09:36:32.987 に答える