C++の浮動小数点型は,float,double,long doubleの3つ
(C++ではlong doubleが正式に規格に加わっている…C言語でも最新の規格では加わってるのかな…).
規格の定義では精度がfloat≦double≦long doubleとなっていればよいので,
float=単精度(32ビット),double=倍精度(64ビット)となっているとは限らない(それどころかIEEE形式である必要もない).
ただ,現実的には,普通floatは単精度,double倍精度になっていると思う.
| 型名 | サイズ | 値の範囲 | |
|---|---|---|---|
float | 
    32ビット | 符号1+指数部8+仮数部23ビット(10進7桁) | 1.17...×10-38〜3.40...×10+38 | 
double | 
    64ビット | 符号1+指数部11+仮数部52ビット(10進15桁) | 2.22...×10-308〜1.79...×10+308 | 
long double | 
    doubleと同じ | 
  ||
なお,浮動小数点形式の定数リテラルのサフィックス“F”(または“f”),“L”(または“l”)は,
“F”はfloat型,“L”はlong double型を示すことになっている.
double型のサフィックスはないようだけど,これはリテラルはFかLで指定して,
double型にはキャストしながら代入されていくのでOKという意味なんだろう.
Intel x86系CPUの場合,double型としては64ビットなのだけど,
演算の中間結果は80ビット(拡張精度)の浮動小数点レジスタスタックに保持していて,精度が高くなっているかもしれない.
たとえばVisual C++のデフォルトがこの実装になっていて,演算中は80ビットの拡張精度になる.
Visual C++の場合はたいへん複雑なことになっていて,
MSDNによると,古い16ビット版Visual C++では,80ビットのlong double型というのが存在していたらしいのだけど,
Win32に切り替わったときにlong doubleはdouble型と同じものという仕様に直したという経緯がある.
しかし,Intel系CPUでは拡張精度がデフォルトになっているため,内部的には拡張精度で演算されて
long doubleがサポートされていたこと,
    Win32でlong doubleをdoubleと同じものにしたこと,
    互換性のために拡張精度版のランタイムライブラリが残してあることなどが説明してある.
  long double型の扱いについての記載を追加.