0

私は次のコードを作成し、奇妙な出力を得ました。誰かがそれがどのように機能するか説明できますか?

main()
{
    float a=0.8;
    float b=0.25;
    if(a==0.8)
        printf("HELLO")
    if(b==0.25)
        printf("WORLD")
}

そして、私が得た出力は驚くほどです

WORLD

前もって感謝します

4

5 に答える 5

5

これは、0.25が2の累乗(つまり2 ^ -2)であるのに対し、0.8はそうではないためです。2の累乗の正確な合計のみを正確に表すことができます。0.8を含む他のすべての数値は、との間floatで精度が異なる近似値として表されdoubleます。0.8ina==0.8は、ですが、doubleaですfloat。それらの表現は異なり、それらの値も異なります。

于 2013-03-26T13:38:41.453 に答える
3

float-valuesを絶対値と比較してはいけません。フロートはIEEE754に従って表され、マシンは正確なフロート値を提供できないため、通常はわずかな丸め誤差があります。

説明、特に丸め規則については、こちらをご覧ください。

于 2013-03-26T13:39:37.977 に答える
2

floatとdoubleを比較しています。数字の後にfを付けてみてください

if(a==0.8f)
    printf("HELLO")
if(b==0.25f)
    printf("WORLD")
于 2013-03-26T14:23:55.990 に答える
0

与えられた答えは正しいです...ドブ博士のアンドリュー・ケーニッヒがフロートとの秩序関係について書いています、見解を持っています:

比較が難しい浮動小数点数

整数と浮動小数点の比較1

于 2013-03-26T13:44:18.530 に答える
0

すべてが最終的にビット単位で格納されます。したがって、同等のバイナリが繰り返し発生する場合に備えて、フローティングポイントは四捨五入されます。

于 2013-03-26T14:33:15.590 に答える