審議中のIEEE 754の拡張である754rの主要な追加の一つは、10進の浮動小数点演算である。科学技術計算の場合は、現在、IEEE 754で定義されている2進の浮動小数点演算で問題が無いが、事務計算では10進演算の必要性が高い。
例えば、2進の浮動小数点形式では、0.1は指数が2の-4で、仮数は1.10011001100 …と1100の繰り返しが無限に続く値となり、有効ビット数の範囲で非常に近い数は表現できるが、きっかり0.1を正確に表現することはできない。このため、利息を計算して、1円単位に切り上げるなどという計算を2進の浮動小数点演算で行うと、誤りが生じる場合がある。このため、財務計算などでは、ソフトウェアで10進の浮動小数点演算を行っている。また、通常、金額のデータなどは10進数の形式で保存されており、これを演算のために2進数に変換し、計算後、10進数に変換して格納するのは、無駄が多い。というのが、10進の浮動小数点演算を追加する理由である。
また、10進の浮動小数点演算器は2進の演算器よりも若干複雑になるが、マイクロプロセサに使用できるトランジスタ数の急増で、その程度のトランジスタの追加は大きな問題ではなくなってきたという背景もある。
IEEE 754rの10進浮動小数点データフォーマット
まだ、規格案の段階であるので確定ではないが、以下のような3種の長さの10進の浮動小数点データフォーマットが提案されている。
decimal32 | decimal64 | decimal128 | |
---|---|---|---|
総ビット長 | 32 | 64 | 128 |
Sign | 1 | 1 | 1 |
Combination Field | 5 | 5 | 5 |
Exponent Continuation | 6 | 8 | 12 |
Coefficient Continuation | 20 | 50 | 110 |
ここで、目新しいのは、Combination Fieldという部分であるが、この説明は、ちょっと後回しにして、表の下側の項目から説明をして行きたい。
浮動小数点データであるので、数値を表現する部分と指数部があり、数値を表現する部分がCoefficient、指数を表現する部分がExponentである。それに符号(Sign) が付いて、10進数は次のように表現される。
![]() |
2進の浮動小数点データの場合は、Fractionは最上位ビットの左側に小数点があり、さらに左にHidden Bitの1があったが、10進浮動小数点データでは、Coefficientは最下位ディジットの右側に小数点があるという形式である。つまり、Coefficientは整数としてコーディングされている。
整数であるので、2進数で表現しても良いのであるが、前述のように10進数で格納されたデータからの変換が必要になるし、指数の底を10にするには処理が面倒である。従って、この部分は10進数で表現している。
10進数の表現は、4ビットを使って0~9までの数字を表現するBCD(Binary Coded Decimal)形式が広く用いられているが、表現できる16種の数値のうちの10個しか使用しておらず、一定の長さのビット数で表現できる有効桁数の点で不利である。
10進数を圧縮格納するDensely Packed Decimal形式
このため、10進数 3桁を10ビットで表現するDensely Packed Decimal(DPD)という形式を用いている。このようなエンコーディングを行っているので、Coefficient部の長さは10ビットの整数倍になっている。
10ビットで表現できる数値は1024個で、DPDでは、そのうちの1000個を使用するので、ビットの利用効率のロスは僅かである。しかし、そのままの形式では演算はできないので、演算前にBCD形式に戻し、演算後、結果をDPD形式に戻す必要がある。
この変換であるが、元のBCD3桁の10進数を(a,b,c,d) (e,f,g,h) (i,j,k,m)とすると、変換後のpqr stu v wxyの10ビットは次の表のようになる。
aei | pqr stu v wxy | |
---|---|---|
000 | bcd fgh 0 jkm | 3桁ともに7以下 |
001 | bcd fgh 1 00m | 最下位の桁が8か9 |
010 | bcd jkh 1 01m | 中位の桁が8か9 |
100 | jkd fgh 1 10m | 最上位の桁が8か9 |
110 | jkd 00h 1 11m | 最上位と中位の桁が8か9 |
101 | fgd 01h 1 11m | 最上位と最下位の桁が8か9 |
011 | bcd 10h 1 11m | 中位と最下位の桁が8か9 |
111 | 00d 11h 1 11m | 全桁が8か9 |
この圧縮法は、BCD形式のある桁の値が8以上の場合は、8か9でしかないことを利用し、その桁の最下位の1ビットだけを出力の10ビットに入れておけば良いということを利用している。
BCDの3桁ともに7以下の場合は、vビットを"0"とすることで表現し、BCDの各桁の下位3ビットをpqr stu wxyビットに格納する。そして、8以上となる桁が有る場合はvビットを"1"とし、それがどの桁であるかをwxビットで表わす。wxが"11"のケースは複数の桁が8以上であり、それらがどの桁であるかの区別をstビットで示す。
この表に見られるように、BCD形式からDPD形式、あるいはその逆の変換は、比較的簡単なロジックで実現でき、ハードウェア実装上の負担は小さい。