-1

これら 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 です

4

3 に答える 3

3

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 浮動小数点を想定しています。)

于 2012-08-17T10:10:51.427 に答える
1

3.3は、2 進浮動小数点では正確に表現できません (循環する小数部分が含まれます)。比較のためにdoubleリテラル3.3を に変換しfloatたり、 に戻したりすると精度が失われるため、比較は等しくありません。double3.3

IEEE 64 ビットdoubleおよび 32 ビットの場合float:

  • リテラル3.3は次のように表されます。0x1.a666666666666p+1
  • リテラル3.3fは として表される0x1.a66666p+1ため(float) 3.3、同じになります
  • double に戻すと、 が得られますが0x1.a666660000000p+1、これは明らかに と等しくありません3.3

3.5一方、 はfloatdouble(as 0x1.cp+1) の両方で正確に表現できるため、比較は等しくなります。

比較の結果は1(等しい場合) または0(等しくない場合) になり、比較の結果は浮動小数点数として出力されます。

于 2012-08-17T09:40:55.070 に答える
0

3.3afloatではなく a double: 数値を異なる精度で比較しています。

于 2012-08-17T09:40:13.440 に答える