floatとdoubleの違いは何ですか?

倍精度と単精度の違いについて読んだことがあります。しかし,ほとんどの場合,「float」と「double」は互換性があり,どちらを使っても結果には影響しないように思われます。これは本当に正しいことなのでしょうか?floatとdoubleはどのような場合に使い分けられるのですか?両者にはどのような違いがあるのでしょうか?

C99規格(ISO-IEC 9899 6.2.5 §10)やC++2003規格(ISO-IEC 14882-2003 3.1.9 §8)には、このように書かれています。

浮動小数点型には3種類あります。浮動小数点型には、floatdoublelong doubleの3種類があります。double型は少なくともfloat型と同等の精度を提供し、long double型は少なくともdouble型と同等の精度を提供します。float 型の値の集合は double 型の値の集合の部分集合であり,double 型の値の集合は long double 型の値の集合の部分集合である。

C++標準では、次のように追加されています。

浮動小数点型の値の表現は、実装で定義されます。

IEEE浮動小数点規格について詳しく書かれている、優れたWhat Every Computer Scientist Should Know About Floating-Point Arithmeticをご覧になることをお勧めします。表現の詳細について学び、大きさと精度の間にトレードオフがあることを理解できるでしょう。浮動小数点表現の精度は、大きさが小さくなるほど高くなるため、-1〜1の浮動小数点数が最も精度の高い浮動小数点数となります。

解説 (0)
  • 倍は64ビット、単精度 (float)は32ビットです。
  • doubleの方が仮数(実数の整数ビット)が大きくなります。
  • 不正確な数値は、doubleの方が小さくなります。
解説 (0)

浮動小数点は倍精度に比べて精度が低い。すでにご存知の方も多いと思いますが、より理解を深めるために What WE Should Know About Floating-Point Arithmeticをお読みください。

解説 (2)