表示されているのは、実数 (浮動小数点を読み取る) をバイナリ コンピューターで完全な精度と正確さで表現できないという事実が原因です。これは人生の事実です。代わりに、コンピュータが値を概算し、定義された形式でメモリに格納します。
最近のほとんどのマシン (MSVC Express を実行しているマシンを含む) の場合、この形式はIEEE 754です。
簡単に言えば、IEEE 754 で実数を格納する方法は次のとおりです。1 つの符号ビット、8 つの指数ビット、および 23 の小数ビットがあります (float
データ型doubles
の場合、それに応じてより多くのビットを使用しますが、形式は同じです)。このため、完璧な精度と精度を実現することはできません。幸いなことに、重要な金融システムや科学システムなど、ほぼすべてのアプリケーションで十分な精度と精度を実現できます。
コードで浮動小数点を使用できるようにするために、IEEE754 について知っておくべきすべてのことを知る必要はありません。ただし、知っておく必要があることがいくつかあります。
1) 浮動小数点の計算と格納に固有の丸め誤差のため、2 つの浮動小数点値を等しいかどうか比較することはできません。代わりに、次のようにする必要があります。
double d = 0.2;
double compare = 0.000000001;
double d2 = something;
if( (d - d2 < compare) && (d2 - d < compare) )
{
// numbers are equal
}
2) 丸め誤差の複合。浮動小数点値に対して操作を実行する回数が増えるほど、精度が失われます。
3) 大きさが大きく異なる 2 つの浮動小数点を追加することはできません。たとえば、1.5x10^30 と 1.5x10^-30 を加算して 60 桁の精度を期待することはできません。