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 つ減らす) に変更すると、答えはノーです。なぜ ?
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 つ減らす) に変更すると、答えはノーです。なぜ ?
通常、 afloat
の精度は 24 ビットです。数値 20000001 = 0x1312d01 を正確に表すには 25 ビットが必要なので、四捨五入する必要があります。表現可能な 2 つの値のちょうど中間にある値の通常の丸めモードは、最終ビット ゼロに丸められるため、20000001 は として 20000000 に丸められfloat
ます。
2000001 = 0x1e8481 を表すには 24 ビット未満 (21) しか必要ないため、丸めは必要ありません。
浮動小数点数は、多くの場合、正確な値ではなく概算値です。あなたはここでそれについてすべて読むことができます:
2つの変数をfloat型として宣言し、それら2つの値を同じにするとします。平等を比較すると、予測できない結果が得られます。詳細については、浮動小数点数を表すためのIEEE標準(IEEE 754)のグーグル。 ウィキペディアの記事
フロートの精度。
16ビット、32ビット、および64ビットのIEEE-754システムでは、どの範囲の数値を表すことができますか?
http://en.wikipedia.org/wiki/Floating_point
http://en.wikipedia.org/wiki/Single-precision_floating-point_format