3
int main() {
float a = 20000000;
float b = 1;
float c = a+b;

if (c==a) { printf("equal"); }

else { printf("not equal");}
return 0;
}

これを実行すると、「等しい」と表示されます。しかし、a の値を 2000000 (0 を 1 つ減らす) に変更すると、答えはノーです。なぜ ?

4

4 に答える 4

7

通常、 afloatの精度は 24 ビットです。数値 20000001 = 0x1312d01 を正確に表すには 25 ビットが必要なので、四捨五入する必要があります。表現可能な 2 つの値のちょうど中間にある値の通常の丸めモードは、最終ビット ゼロに丸められるため、20000001 は として 20000000 に丸められfloatます。

2000001 = 0x1e8481 を表すには 24 ビット未満 (21) しか必要ないため、丸めは必要ありません。

于 2012-10-28T20:33:42.357 に答える
3

浮動小数点数は、多くの場合、正確な値ではなく概算値です。あなたはここでそれについてすべて読むことができます:

http://en.wikipedia.org/wiki/Floating_point

于 2012-10-28T20:30:53.887 に答える
1

2つの変数をfloat型として宣言し、それら2つの値を同じにするとします。平等を比較すると、予測できない結果が得られます。詳細については、浮動小数点数を表すためのIEEE標準(IEEE 754)のグーグル。 ウィキペディアの記事

于 2012-10-28T20:32:00.443 に答える