0
float a = 0.7;
if(a<0.7)
  printf("true");
else
  printf("false");

OUTPUT : true

ここで、aの値を1.7に変更すると、

float a = 1.7;
if(a<1.7)
  printf("true");
else
  printf("false");

OUTPUT : false

0.7はdouble(HIGH PRECISION)として扱われ、aはfloat(LESS PRECISION)であるため、<0.7であり、2番目の場合は再び同じである必要があるため、も出力されますtrue。なぜここで出力に違いがあるのですか?

PS:私はすでにこのリンクを見ました。

4

4 に答える 4

5

リンクした質問に対する私の答えを見たので、それを調べて、2番目のシナリオを調べるために必要な変更を加えましょう。


バイナリでは、1.7は次のとおりです。

b1.1011001100110011001100110011001100110011001100110011001100110...

ただし、1.7は倍精度リテラルであり、その値は、最も近い表現可能な倍精度値に丸められた1.7です。

b1.1011001100110011001100110011001100110011001100110011

10進数では、それは正確に次のとおりです。

 1.6999999999999999555910790149937383830547332763671875

float a = 1.7と書くと、そのdouble値は再び単精度に丸められ、aは2進値を取得します。

b1.10110011001100110011010

これはまさに

 1.7000000476837158

10進数(切り上げに注意してください!)

比較(a <1.7)を行う場合、この単精度値(すべての単精度値は倍精度で表現できるため、丸められないdoubleに変換されます)を元の倍精度値と比較しています。なぜなら

 1.7000000476837158 > 1.6999999999999999555910790149937383830547332763671875

比較は正しくfalseを返し、プログラムは「false」を出力します。


では、なぜ結果が0.7と1.7で異なるのでしょうか。それはすべて丸めにあります。単精度数は24ビットです。0.7を2進数で書き留めると、次のようになります。

b.101100110011001100110011 00110011...

(24番目のビットの後にそれがどこにあるかを示すためのスペースがあります)。24ビット目以降の次の桁はゼロであるため、24ビットに丸める場合は切り捨てます。

次に1.7を見てください。

b1.10110011001100110011001 10011001...

先頭があるため1.、24番目のビットの位置がシフトし、24番目のビットの次の桁が1になり、代わりに切り上げます。

于 2012-08-19T14:50:04.383 に答える
4

floatおよびdoubleがそれぞれIEEE-75432ビットおよび64ビット浮動小数点形式の場合、正確floatに1.7に最も近いのは〜1.7000000477であり、最も近いのdoubleは〜1.6999999999999999556です。この場合、最も近いfloatものはたまたま最も近いものよりも数値的に大きくなりdoubleます。

于 2012-08-19T13:56:19.730 に答える
3

0.7と1.7は、2進数で同じように表されていないため、一方は実際の(正確な)値よりもわずかに多く、もう一方はわずかに少ない可能性があります。

于 2012-08-19T13:38:24.997 に答える
1

それはすべて、浮動小数点の2進数表現と関係があります。この主題に関する優れた参考資料は次のとおりです。すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと。

于 2012-08-19T14:33:25.820 に答える