倍精度浮動小数点数
64ビットの「倍精度」データで表される実際の数値は、符号を s i g n {\displaystyle sign} 、バイアスのある指数部を e {\displaystyle e} 、52ビットの仮数部のビット列を b n {\displaystyle b_{n}} とすると、 = ( − 1 ) s i g n ( 1. b − 1 b − 2 ⋯ b − 52 ) 2 × 2 e − 1023 {\displaystyle =(-1)^{sign}(1.b_{-1}b_{-2}\cdots {}b_{-52})_{2}\times 2^{e-1023}} となり、より正確に表すと次のようになる。
v a l u e = ( − 1 ) s i g n ( 1 + ∑ i = 1 52 b − i 2 − i ) × 2 ( e − 1023 ) {\displaystyle value=(-1)^{sign}(1+\sum _{i=1}^{52}\ b_{-i}2^{-i})\times 2^{(e-1023)}}
2=4503599627370496 と 2=9007199254740992 の間で表現できる数値は正確に整数に対応している。2 から 2 までの範囲では、常にその2倍となるので、偶数しか表現できない。逆に 2 と 2 の間の範囲では間隔が0.5になる。
数値の小数部の間隔は 2 から 2 の範囲で 2 から 2 までである。従って最も近い値への数値の丸め誤差の最大(計算機イプシロン)は 2 となる。
2といった数値を正確に扱う事が苦手であり(表示上は補正されているが、10進小数を2進小数に変換すると殆どの場合循環小数となり、微小な切り捨てが発生する)高速性よりも(10進の世界での)正確性が優先されるようなケースにおいてBCD小数は強みを発揮した(各種利息計算など)。
ただし当時のスペックにおいて10進小数は相応に重い処理であり、DAAという10進補正用の専用CPU命令を持っていたZ80であっても複雑な演算になればなるほど(例えば三角関数や対数関数のような数学関数)2進小数より負荷が増していく。 MSX-BASICにおいて10進小数が採用された理由は、マイクロソフトBASICの中でも比較的後期に開発され新しい実装を試せた事、加えてホームコンピュータという需要の開拓においてより一般性を高めたいアスキー側の狙いがあったと考えられる。
CPUの浮動小数点ユニットとの相互運用を視野に入れなければならない現代の言語では、特殊な用途を除いてBCD小数を目にする機会は少ない。
Emin (00116進) = −1022
E (50) = −973
Emax (7FE16進) = 1023
指数部バイアス (3FF16進) = 1023
指数部バイアスは、エクセスNとも言う。詳しくは符号付数値表現を参照されたい。真の指数値は、指数部の値から指数部バイアスを引いた値となる。
00016進 と 7FF16進 は予約された指数値である。
00016進 は 0(仮数部も0)と非正規化数(仮数部が0でない)を表現するのに使われる。
7FF16進 は無限大(仮数部が0)やNaN(仮数部が0でない)を表現するのに使われる。
従って、全てのビットパターンが符号として意味がある。これらの例外を除くと、倍精度浮動小数点数は次のように表される。
( − 1 ) sign × 2 exponent − exponent bias × 1. mantissa {\displaystyle (-1)^{\text{sign}}\times 2^{{\text{exponent}}-{\text{exponent bias}}}\times 1.{\text{mantissa}}}