倍精度
情報処理において、倍精度(ばいせいど、Double Precision)は、コンピュータ内のあるアドレスの2つのメモリ単位に数値を格納するコンピュータの数値表現の一種である。倍精度数(Double-precision Number)とも呼び、整数、固定小数点数、浮動小数点数のいずれの定義ともなりうる。
歴史的には、FORTRAN言語と密接にかかわって来た。コンピュータのアーキテクチャが落ち着き、マイクロプロセッサが浮動小数点を扱い始め、出現したコプロセッサi8087がIEEEでの標準化のきっかけとなった。 FORTRAN時代には、単精度よりも精度がよければ倍精度を名乗る事ができた。同じビット数で、より広範囲の数を扱う為に16進の浮動小数点形式もあり、この場合は単精度32ビットでは有効数字は6桁程度となり技術計算では倍精度以上を使わねばならないようなコンピュータも存在した。
最近のコンピュータでは、単精度は32ビット、倍精度は64ビットで格納される。倍精度浮動小数点数(Double Precision Floating Point)はIEEE 754で標準化されており、8バイトで浮動小数点数を表す。
目次 |
倍精度浮動小数点数の形式 [編集]
倍精度浮動小数点数は単精度に比べて性能や帯域幅のコストがかかるが、表現できる数値の範囲が広いためPCでもよく使われている。単精度浮動小数点数と同様、同じサイズの整数のフォーマットに比べると表現できる精度(桁数)が少ない。IEEE 754 での定義は次の通りである。
- 符号ビット (sign): 1 ビット
- 指数部の幅 (exponent): 11 ビット
- 仮数部の幅=精度 (fraction): 52 ビット(暗黙のうちに1ビット追加されるので、正確には53ビット)
指数部が全て 0 でない限り、この形式では「暗黙の整数ビット」を 1 とみなす。従って小数部の52ビットだけがメモリフォーマット上に出現し、全体としての精度は53ビット(十進に直すと約16桁、
)である。ビットのレイアウトは以下のようになる。
64ビットの「倍精度」データで表される実際の数値は、符号を sign、バイアスのある指数部を e、52ビットの仮数部のビット列をbnとすると、
となり、より正確に表すと次のようになる。
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 は予約された指数値である。
従って、全てのビットパターンが符号として意味がある。これらの例外を除くと、倍精度浮動小数点数は次のように表される。

倍精度浮動小数点数の例 [編集]
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乗である。
ちなみに、同時期の8ビットパソコンのBASICでは、多くがBCDではなく2進での演算であった。
