1

私は困惑しています。データ型を使用するとこのテストに合格するが、doubleデータ型を使用すると失敗する理由については説明がありませんfloat。次のコード スニペットを検討してください。

float total = 0.00;

for ( int i = 0; i < 100; i++ ) total += 0.01;

1.00と予想totalされますが、0.99 です。これはなぜですか?GCC と clang の両方でコンパイルしましたが、両方のコンパイラで同じ結果が得られました。

4

2 に答える 2

4

これを試して:

#include <stdio.h>

int main(){
    float total = 0.00;
    int i;
    for (i = 0; i < 100; i++)
        total += 0.01;

    printf("%f\n", total);

    if (total == 1.0)
        puts("Precise");
    else
        puts("Rounded");
}

少なくともほとんどのマシンでは、「Rounded」の出力が得られます。言い換えれば、結果はたまたま十分に近く、印刷すると丸められて正確に 1.00 のように見えますが、実際にはそうではありません。に変更totalしてdoubleも、同じ結果が得られます。

于 2013-08-09T06:13:51.690 に答える
3

10 進数の 0.01 の値は、次の系列として表されます: a1*(1/2) + a2*(1/2)^2 + a3*(1/2)^4 + など。ここaNで、 は 0 または 1 です。

a1、a2 の特定の値と、必要な小数ビット ( ) の数を把握するのはあなたに任せますaN。場合によっては、小数を (1/2)^n 値の有限系列で表すことができないことがあります。

この系列の合計が 10 進数で 0.01 になるには、浮動小数点aN数に格納されているビット数 (ビットの完全なワードから符号と指数のビット数を差し引いたもの) を超える必要があります。しかし、double にはより多くのビットがあるため、0.01 decimal can/might/maybe (計算を行う) を正確に定義できます。

于 2013-08-09T06:14:15.567 に答える