デフォルトでこのように格納されない理由は、固定されたビット セットに収まる有効な値の範囲が小さいためです。クラスには、1/ MAXINTfloat
から MAXINT (プラスまたはマイナス) までの数値を格納できます。AC/C++float
は、1E+37 ~ 1E-37 (プラスまたはマイナス) の数値を表すことができます。言い換えれば、標準float
は、半分のビット数を使用しているにもかかわらず、26 桁大きい値と 26 桁小さい値を表すことができます。一般に、完全に正確であるよりも、非常に大きな値と非常に小さな値を表現できる方が便利です。これは、丸めによって 1/3 のような小さな分数で正しい答えが得られる傾向があるため、特に当てはまります。g++ では、次は 1 を返します。
std::cout << ((1.0/3.0) * 3.0) << std::endl;
C++ の型のビット単位は固定サイズであることに注意してください。したがって、32 ビットのデータ型には最大でも MAX_UINT 値があります。表現方法を変更すると、正確に表現できる値を変更するだけで、値を増やすことはできません。これ以上詰め込むことはできないため、「より正確」にすることはできません。5.4235E+25 のように、1/3 を正確に表すことができる代わりに、他の値を正確に表すことができません。
float
1E-9 と 1E+9 (32 ビット整数を想定) の間の値をより正確に表現できることは事実ですが、この範囲外の値を完全に表現することはできません。さらに悪いことに、標準float
の精度は常に 6 桁ですfloat
が、値がゼロにどれだけ近いかによって精度が異なります。(そして、2 倍のビットを使用していることに注意してくださいfloat
。)
(私は 32 ビットint
s を想定しています。同じ引数が 64 ビットint
s に適用されます。)
編集float
:また、人々がs を使用するほとんどのデータは正確ではないことに注意してください。センサーからデータを読み取っている場合、すでに不正確になっているため、値を「完全に」表現しようとしても意味がありません。あらゆる種類のコンピューティング コンテキストでを使用している場合float
、それは問題になりません。画面の 1/3 の位置にテキストを表示することが目的である場合、「1/3」を完全に記述しても意味がありません。
完全な精度を本当に必要とするのは数学者だけであり、彼らは通常、これを実現するソフトウェアを持っています。与える以上の精度を必要とする人はほとんどいませんdouble
。