long double
読み:ロング-ダブル
外語:long double
C/C++
などの
予約語
の一つ。
目次
概要
特徴
仕様
符号
言語
C/C++
利用法
マクロ定数
主な実装
Delphi
概要
実数型
変数の型の一つ。
double
よりも更に長い
浮動小数点数
を宣言する。
C/C++の場合は、概ね
長倍精度
から
四倍精度
程度の浮動小数点数を表わすことが想定されている。
但し、言語仕様上はビット長は保証されておらず、
float
≦
double
≦
long double
≒
__float80
≦
__float128
とされている。また実際、多くの実装では128ビット長にはなっていない。GCCでは4.6以降で独自に
__float128
型を用意した。
特徴
仕様
実装により、仕様がかなり異なる。
x86
環境では、
double
と同じ64ビットであったり、より大きな80ビット長が利用できることもある。
80ビットは
x87
つまりx86のFPUの仕様に完全対応した実装である。x87仕様は、符号部1ビット+指数部15ビット+仮数部64ビット(実質65ビット)で、指数に+16383のゲタをはかせるバイアス方式、基数2の80ビット長である。
この場合、有効桁数は10進数表現で19桁程度。GCCでは
__float80
という実装依存の別名を用意している。
符号
long doubleは浮動小数点形式で値を扱うため、整数型と異なり、常に符号ありで処理される。
したがって、
signed
/
unsigned
による符号の有無の指定は無効で、エラーになる。
言語
C/C++
利用法
printf
では%Lfなどで表わす。
直定数の接尾辞(サフィックス)は、qまたはQである。
マクロ定数
ANSI Cの時代より、float.hにおいて以下の9個のマクロ定数が定義されるようになった。これを利用すると、その環境での長さを得ることができる。
また最後の二つ(_から始まるもの)は標準外だが、拡張で、実装によっては存在する。
以下の例の数値は、long doubleが80ビットのBorland C++Builderの場合。但し最後の二つはBorland C++Builderに存在しない。double=long doubleであるMicrosoft Visual C/C++の値は、
double
を参照のこと。
LDBL_DIG
10進数精度 (例えば18)
LDBL_EPSILON
1.0+DBL_EPSILON != 1.0 となる最小値 (例えば1.084202172485504434e-019L)
LDBL_MANT_DIG
仮数ビット長 (例えば53)
LDBL_MAX
最大値 (例えば1.189731495357231765e+4932)
LDBL_MAX_10_EXP
最大10進指数 (例えば+4932)
LDBL_MAX_EXP
最大2進指数 (例えば+16384)
LDBL_MIN
最小値 (例えば3.36210314311209351e-4932)
LDBL_MIN_10_EXP
最小10進指数 (例えば-4931)
LDBL_MIN_EXP
最小2進指数 (例えば-16381)
_LDBL_RADIX
指数の
基数
(例えば2)
_LDBL_ROUNDS
丸めモード (例えば1)
主な実装
Microsoft Visual C++ 2003
Win64
環境であってもdoubleと同じ64ビット長であり、128ビットは現時点では使用できない。
Borland Developer Studio 2006のBorland C++Builder
Win32
環境、Win64環境共に、80ビット長である。
Microsoftの実装とは互換性がないが、この仕様でx86のFPUの機能(8087の頃から一貫して80ビット)がフルに利用出来る。
GCC
確認した範囲では、GCCは80ビット長である。
なお、sizeofで取得できるサイズは、
IA-32
では96ビット、
x64
に対応した版/環境では128ビットとなるようである。これは単に
アラインメント
の調整のためで、FPUの精度が向上したわけではない。
Delphi
Delphi
(Pascal)では、Extended型がほぼ相当する。
再検索