long double
読み:ロング-ダブル
外語:long double

 C/C++などの予約語の一つ。
目次

概要
 実数型変数の型の一つ。doubleよりも更に長い浮動小数点数を宣言する。
 C/C++の場合は、概ね長倍精度から四倍精度程度の浮動小数点数を表わすことが想定されている。
 但し、言語仕様上はビット長は保証されておらず、
 floatdoublelong 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型がほぼ相当する。

再検索