私は次のコードを作成し、奇妙な出力を得ました。誰かがそれがどのように機能するか説明できますか?
main()
{
float a=0.8;
float b=0.25;
if(a==0.8)
printf("HELLO")
if(b==0.25)
printf("WORLD")
}
そして、私が得た出力は驚くほどです
WORLD
前もって感謝します
私は次のコードを作成し、奇妙な出力を得ました。誰かがそれがどのように機能するか説明できますか?
main()
{
float a=0.8;
float b=0.25;
if(a==0.8)
printf("HELLO")
if(b==0.25)
printf("WORLD")
}
そして、私が得た出力は驚くほどです
WORLD
前もって感謝します
これは、0.25が2の累乗(つまり2 ^ -2)であるのに対し、0.8はそうではないためです。2の累乗の正確な合計のみを正確に表すことができます。0.8を含む他のすべての数値は、との間float
で精度が異なる近似値として表されdouble
ます。0.8
ina==0.8
は、ですが、double
はa
ですfloat
。それらの表現は異なり、それらの値も異なります。
float
-valuesを絶対値と比較してはいけません。フロートはIEEE754に従って表され、マシンは正確なフロート値を提供できないため、通常はわずかな丸め誤差があります。
説明、特に丸め規則については、こちらをご覧ください。
floatとdoubleを比較しています。数字の後にfを付けてみてください
if(a==0.8f)
printf("HELLO")
if(b==0.25f)
printf("WORLD")
すべてが最終的にビット単位で格納されます。したがって、同等のバイナリが繰り返し発生する場合に備えて、フローティングポイントは四捨五入されます。