3

私のコードは

void main()
{
    float a = 0.7;
    if (a < 0.7)
        printf("c");
    else
        printf("c++");
} 

印刷されC、これはadouble の定数値として扱われるので問題なく、その値0.699999は より小さいものになり0.7ます。

ここで、値を0.1,0.2,0.3til 0.9inに変更しa、さらにatif conditionに変更するとC++0.7 and 0.9両方が等しいかaが大きいことを意味します。

この概念がすべての価値を考慮しないのはなぜですか?

4

1 に答える 1

11

あなたの言う「コンセプト」とは?

あなたが言及した数値は、(精度に関係なく)バイナリ浮動小数点形式で正確に表現できません。あなたが言及したすべての数字は、ドットの後に無限の数の2進数を持つことになります。

どちらfloatdouble無限の精度を持たないため、floatおよびdoubleフォーマットでは、実装はこれらの値を近似的に、最も近い表現可能な 2 進浮動小数点値で表現します。これらの近似値は、 と で異なりfloatますdouble。また、近似float値は、近似値よりも大きくなったり小さくなったりする可能性がありdoubleます。したがって、観察した結果。

たとえば、私の実装では、の値0.7は次のように表されます

+6.9999998807907104e-0001 - float
+6.9999999999999995e-0001 - double

一方、 の値0.1は次のように表されます。

+1.0000000149011611e-0001 - float
+1.0000000000000000e-0001 - double

ご覧のとおり、double表現は最初の例よりも大きくなっfloatていますが、2 番目の例ではその逆になっています。(上記は 10 進数表記であり、それ自体で丸められますが、効果を十分に説明するのに十分な精度があります。)

于 2012-09-06T17:47:02.920 に答える