浮動小数点型

C++の浮動小数点型は,floatdoublelong doubleの3つ (C++ではlong doubleが正式に規格に加わっている…C言語でも最新の規格では加わってるのかな…). 規格の定義では精度がfloatdoublelong doubleとなっていればよいので, float=単精度(32ビット),double=倍精度(64ビット)となっているとは限らない(それどころかIEEE形式である必要もない). ただ,現実的には,普通floatは単精度,double倍精度になっていると思う.

一般的な実装例/caption>
型名 サイズ 値の範囲
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型のサフィックスはないようだけど,これはリテラルはFLで指定して, double型にはキャストしながら代入されていくのでOKという意味なんだろう.

参考:Intel x86系CPUの浮動小数点演算中間結果

Intel x86系CPUの場合,double型としては64ビットなのだけど, 演算の中間結果は80ビット(拡張精度)の浮動小数点レジスタスタックに保持していて,精度が高くなっているかもしれない. たとえばVisual C++のデフォルトがこの実装になっていて,演算中は80ビットの拡張精度になる.

Visual C++の場合はたいへん複雑なことになっていて, MSDNによると,古い16ビット版Visual C++では,80ビットのlong double型というのが存在していたらしいのだけど, Win32に切り替わったときにlong doubledouble型と同じものという仕様に直したという経緯がある. しかし,Intel系CPUでは拡張精度がデフォルトになっているため,内部的には拡張精度で演算されて


はたいたかし
2001-07-21 初稿
2006-08-18 改訂1 Visual C++ 2005におけるlong double型の扱いについての記載を追加.
トップ > 開発ツール > C++