3

次のプログラムを実行すると:

#include <stdio.h>
#include <math.h>

int main()
{
    double sum, increase;
    long amount, j;

    printf("sum = ");
    scanf("%lf", &sum);
    printf("increase = ");
    scanf("%lf", &increase);
    printf("amount = ");
    scanf("%ld", &amount);

    for (j = 1; j <= amount; j++)
    {
        sum += increase;
    }

    printf("%lf\n", sum);

    return 0;
}

これらの値に対して次の応答が得られます。

MacBook:c benjamin$ ./test
sum = 234.4
increase = 0.000001
amount = 198038851
432.438851
MacBook:c benjamin$ ./test
sum = 234.4
increase = 0.000001
amount = 198038852
432.438851
MacBook:c benjamin$ ./test
sum = 234.4
increase = 0.000001
amount = 198038853
432.438852

ここで、変数「金額」をそれぞれの場合で 1 ずつ増やしました。

  • 最初のものでは、合計は私が期待するものを提供します。
  • 2 番目では、驚くべきことに同じ値が得られます。
  • 3 番目では、合計が続きます。

なぜこれが起こるのですか?

コードはあまり役に立たないように見えますが、問題の部分だけを書きました。私は実際にそれをより大きなプログラムで使用したかったのです。

ありがとう!

4

1 に答える 1

3

これは、数値ではなく、フォーマットの問題です。に変更printfすると

printf("%.12lf\n", sum);

結果は、期待どおりに見えます。

sum = increase = amount = 432.438851000198
sum = increase = amount = 432.438852000198
sum = increase = amount = 432.438853000198

最後の「がらくた」は、浮動小数点数の精度が限られているためです。

于 2012-05-21T23:18:18.187 に答える