倍精度浮動小数点数

出典: フリー百科事典『ウィキペディア(Wikipedia)』
倍精度から転送)
移動: 案内検索

情報処理において、倍精度浮動小数点数(ばいせいどふどうしょうすうてんすう、Double precision floating point number)は、コンピュータの数値表現の一種である。

double precisionという名前は、FORTRANにおける型の名前が由来である。また現代の用語として、「倍」精度と言うのは、単精度に対してそのように言うわけだが、これは32ビットを1ワードとする32ビットアーキテクチャを基にしている。

昔のFORTRANでは、単精度(REAL型)よりも精度が高ければ倍精度を名乗る事ができた(そもそもワードの長さも浮動小数点のフォーマットも機種ごとにまちまちだった)。IBMのSystem/360で採用され大型機の事実上の標準となった、指数の基数が16の浮動小数点形式は、32ビット単精度では最悪の場合の精度が十進で6桁程度となり、技術計算では倍精度以上を使わねばならないという問題があった。 (注:FORTRAN言語は,標準の整数型が1ワードを占め,実数型(=単精度型)が同じく1ワードを占め、倍精度実数型は2ワードを占めることを前提にしている。)

標準であるIEEE 754では、単精度は32ビット(4オクテット)、倍精度は64ビット(8オクテット)である。

倍精度浮動小数点数の形式[編集]

倍精度浮動小数点数は単精度浮動小数点数に比べて性能や帯域幅のコストがかかるが、表現できる数値の範囲が広いためPCでもよく使われている。単精度浮動小数点数と同様、同じサイズの整数のフォーマットに比べると表現できる精度(桁数)が少ない。IEEE 754 での定義は次の通りである。

  • 符号ビット (sign): 1 ビット
  • 指数部の幅 (exponent): 11 ビット
  • 仮数部の幅=精度 (fraction): 52 ビット(暗黙のうちに1ビット追加されるので、正確には53ビット)

指数部が全て 0 でない限り、この形式では「暗黙の整数ビット」を 1 とみなす。従って小数部の52ビットだけがメモリフォーマット上に出現し、全体としての精度は53ビット(十進に直すと約16桁、53\log_{10}(2) \approx 15.955)である。ビットのレイアウトは以下のようになる。

IEEE 754 Double Floating Point Format.svg

64ビットの「倍精度」データで表される実際の数値は、符号を sign、バイアスのある指数部を e、52ビットの仮数部のビット列をbnとすると、 = (-1)^{sign}(1.b_{-1}b_{-2}...b_{-52})_2 \times 2^{e-1023} となり、より正確に表すと次のようになる。

  •  value = (-1)^{sign}(1 + \sum_{i=1}^{52} \ b_{-i}2^{-i} )\times 2^{(e-1023)}

252=4,503,599,627,370,496 と 253=9,007,199,254,740,992 の間で表現できる数値は正確に整数に対応している。253 から 254 までの範囲では、常にその2倍となるので、偶数しか表現できない。逆に 251 と 252 の間の範囲では間隔が0.5になる。

数値の小数部の間隔は 2n から 2n+1 の範囲で 2-52 から 2-53 までである。従って最も近い値への数値の丸め誤差の最大(計算機イプシロン)は 2-53 となる。

指数部の符号化方式[編集]

  • Emin (0x001) = -1022
  • E (50) = -973
  • Emax (0x7fe) = 1023
  • 指数部バイアス (0x3ff) = 1023

指数部バイアスは、エクセスNとも言う。詳しくは符号付数値表現を参照されたい。真の指数値は、指数部の値から指数部バイアスを引いた値となる。

0x000 と 0x7ff は予約された指数値である。

  • 0x000 は 0(仮数部も0)と非正規化数(仮数部が0でない)を表現するのに使われる。
  • 0x7ff は無限大(仮数部が0)やNaN(仮数部が0でない)を表現するのに使われる。

従って、全てのビットパターンが符号として意味がある。これらの例外を除くと、倍精度浮動小数点数は次のように表される。

(-1)^{\text{sign}} \times 2^{\text{exponent} - \text{exponent bias}} \times 1.\text{mantissa}

倍精度浮動小数点数の例[編集]

0x3ff0 0000 0000 0000   = 1
0x3ff0 0000 0000 0001   = 1.0000000000000002、1より大きい最小の数
0x3ff0 0000 0000 0002   = 1.0000000000000004
0x4000 0000 0000 0000   = 2
0xc000 0000 0000 0000   = –2
0x0000 0000 0000 0001   ≈ 4.9406564584124654 x 10-324 (正の最小の非正規化数)
0x0010 0000 0000 0000   ≈ 2.2250738585072014 x 10-308 (正の最小の正規化数)
0x7fef ffff ffff ffff   ≈ 1.7976931348623157 x 10308 (倍精度浮動小数点数の最大値)
0x0000 0000 0000 0000   = 0
0x8000 0000 0000 0000   = –0
0x7ff0 0000 0000 0000   = 正の無限大
0xfff0 0000 0000 0000   = 負の無限大
0x3fd5 5555 5555 5555   ≈ 1/3

(1/3 は単精度とは異なり、切り下げられる。これは仮数部のビット数が奇数であるため。)

より詳細な例:

16進表現で 0x3fd5 5555 5555 5555 の場合、
  符号 = 0x0
  指数部 = 0x3fd = 1021
  指数部バイアス = 1023 (上述)
  仮数部 = 0x5 5555 5555 5555
  値 = 2(指数部 − 指数部バイアス) × 1.仮数部 – 仮数部はこの段階では十進に変換されない
        = 2–2 × (0x15 5555 5555 5555 × 2–52)
        = 2–54 × 0x15 5555 5555 5555
        = 0.333333333333333314829616256247390992939472198486328125
        ≈ 1/3

MSXの場合[編集]

MSX-BASICの演算ルーチンMATHPACKの場合、同様に8バイトで表すが、IEEE 754とは異なり

  • s(符号ビット): 1
  • y(指数部の幅): 7
  • x(仮数部の幅=精度): 56
 syyy yyyy xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx

であり、指数部をバイナリ、仮数部をBCDで表現する。 そのため、有効数字は正確に10進で14桁で、指数は±63乗である。

他のパソコンのBASICはほとんどが2進での演算であった(他にBCDを採用した機種としてFP-1000がある)。

関連項目[編集]