これら 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たり、 に戻したりすると精度が失われるため、比較は等しくありません。double3.3
IEEE 64 ビットdoubleおよび 32 ビットの場合float:
3.3は次のように表されます。0x1.a666666666666p+13.3fは として表される0x1.a66666p+1ため(float) 3.3、同じになります0x1.a666660000000p+1、これは明らかに と等しくありません3.3。3.5一方、 はfloatとdouble(as 0x1.cp+1) の両方で正確に表現できるため、比較は等しくなります。
比較の結果は1(等しい場合) または0(等しくない場合) になり、比較の結果は浮動小数点数として出力されます。
3.3afloatではなく a double: 数値を異なる精度で比較しています。