これら 2 つのコードの背後にある出力/概念を親切に説明してください。
float x;
x=(float)3.3==3.3;
printf("%f",x);
上記の出力は 0.000000 です
float x;
x=(float)3.5==3.5;
printf("%f",x);
上記の出力は 1.000000 です
これら 2 つのコードの背後にある出力/概念を親切に説明してください。
float x;
x=(float)3.3==3.3;
printf("%f",x);
上記の出力は 0.000000 です
float x;
x=(float)3.5==3.5;
printf("%f",x);
上記の出力は 1.000000 です
C のソース テキストでは、数値「3.3」は、数値 3.3 に非常に近い double 型の値を表します。優れたコンパイラは、「3.3」を 3.3 に最も近い double 型の値、つまり 3.2999999999999982236431605997495353221893310546875 に変換しますが、C 標準ではそれは必要ありません。
式(float) 3.3
はこの double を float に変換し、double に最も近い float 型の値を生成します。その値は 3.2999999523162841796875 です。
次に、式(float) 3.3 == 3.3
は float 値と double 値を比較します。(これにより float が double に暗黙的に変換されますが、この変換中に値は変更されません。) 値が等しくないため、比較の結果は 0 です。
3.5 は double として正確に表現できるため、数値 "3.5" は正確に値 3.5 を生成します。これも float として正確に表現できるため、float に変換すると 3.5 になります。次に、2 つの値を比較すると 1 になります。
(この回答は、非常に一般的な IEEE 754 浮動小数点を想定しています。)
3.3
は、2 進浮動小数点では正確に表現できません (循環する小数部分が含まれます)。比較のためにdouble
リテラル3.3
を に変換しfloat
たり、 に戻したりすると精度が失われるため、比較は等しくありません。double
3.3
IEEE 64 ビットdouble
および 32 ビットの場合float
:
3.3
は次のように表されます。0x1.a666666666666p+1
3.3f
は として表される0x1.a66666p+1
ため(float) 3.3
、同じになります0x1.a666660000000p+1
、これは明らかに と等しくありません3.3
。3.5
一方、 はfloat
とdouble
(as 0x1.cp+1
) の両方で正確に表現できるため、比較は等しくなります。
比較の結果は1
(等しい場合) または0
(等しくない場合) になり、比較の結果は浮動小数点数として出力されます。
3.3
afloat
ではなく a double
: 数値を異なる精度で比較しています。