0

次のコードでは、次のような結果が生成されることがわかります。出力がこのようになる理由について何か考えはありますか?

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

int main() {
    int i = 0;
    for(i = 0; i < 10; i++) {
        printf("%d\t\t\t%d\t\t\t", i, (int)pow(10, i));    
        printf("%f\n", pow(10, i));
    }
    return 0;
}

出力:

0                       1                       1.000000

1                       10                      10.000000

2                       99                      100.000000

3                       1000                    1000.000000

4                       9999                    10000.000000

5                       100000                  100000.000000

6                       1000000                 1000000.000000

7                       9999999                 10000000.000000

8                       99999999                100000000.000000

9                       999999999               1000000000.000000
4

2 に答える 2

2

浮動小数点に関する SO に関する他の何十億もの質問のすべてと同様に、答えは、すべての数値を正確に表現できるわけではないということです。

また、正確に表現できpowたとしても、ループ内で動作するようなものから悪い結果が得られる場合があります。つまり、操作の誤差が小さくても、何度もやると誤差が大きくなります。

またはその他の浮動小数点指定子pow(10,4)を使用してからの戻り値を出力してみてください。%.50f9999.999999923762346510000

価値があるのは、CygWin の下で gcc 3.4.4 の下で正しい結果が生成されるため、あまり正確ではない の実装を使用している可能性がありますpow

于 2010-08-18T06:36:25.740 に答える
2

round()にキャストする前に関数を使用してくださいint。そうしないと、末尾の数字が切り捨てられます。

于 2010-08-18T06:22:54.623 に答える