0

ここで、x は 0.7 ではなく 0.699999 を使用していますが、y は割り当てられた 0.5 を使用しています。この動作の正確な理由を教えてください。

#include<iostream>
using namespace std;

int main()
{
float x = 0.7;
float y = 0.5;
if (x < 0.7)
{
if (y < 0.5)
   cout<<"2 is right"<<endl;
else 
   cout<<"1 is right"<<endl;
}
else 
   cout<<"0 is right"<<endl; 

cin.get();
return 0;
}
4

4 に答える 4

11

インターネット上には、IEEE 浮動小数点に関する情報がたくさんあります。

0.5 = 1/2

したがって、2 のべき乗の和として正確に記述できます。

0.7 = 7/10 = 1/2 + 1/5 = 1/2 + 1/8 + a bit more... etc

が正確に 2のbit moreべき乗になることはありません。

于 2013-07-12T10:21:19.857 に答える
0

コンピュータでは実数や非有理数を正確に表現できないため、浮動小数点表現は概算にすぎません。` float を操作する場合、エラーは一般に蓄積されます。

ただし、この目的のためにネイティブ データ型を使用してデジタル コンピューター上で正確に表現できる実数がいくつかあります (*)。0.5 はその 1 つです。

(*) は、CPU の浮動小数点処理ユニットが動作する形式を意味します (ieee754 で標準化されています)。特殊なライブラリは、プロセッサの内部形式の制限を正確に超える整数および有理数を表すことができます。人間が読める 10 進展開に変換するときに丸め誤差が依然として発生する可能性があり、代替手段も無理数に拡張されません (例: sqrt(3))。もちろん、これらのライブラリは速度が低下します。

于 2013-07-12T10:21:14.407 に答える
0

これは、浮動小数点がメモリ内でどのように表現されるかに関係しています。これらのビット数には制限があります (通常 a の場合は 32 float)。これは、表現できる値の数が限られていることを意味します。これは、実数の無限集合からの多くの数を表現できないことを意味します。

このウェブサイトはさらに説明します

于 2013-07-12T10:22:26.437 に答える
0

正確な理由を理解したい場合は、マシンの浮動小数点表現を見てください (ほとんどの場合、IEEE 754、https://en.wikipedia.org/wiki/IEEE_floating_pointです)。

堅牢で移植可能なコードを記述したい場合は、浮動小数点値が等しいかどうかを比較しないでください。それらを常にある程度の精度で比較する必要があります (たとえば、 where is say とx==y書く代わりに)。fabs(x-y) < epseps1e-6

于 2013-07-12T10:22:30.477 に答える