仕事で役立つ人気ビジネスアプリおすすめ!
[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
コンピュータアーキテクチャの話 (93) ヒドン(Hidden)ビットで精度を1ビットを稼ぐ
IEEE 754規格は、当時、Zilog社に在籍していたDavid Stevenson氏を議長として、延べ100人近くの参加者による委員会で検討、作成された。規格書には、これらの人達の名前と、所属する企業や団体の名前が50程度並んでいる。
この規格の制定時期が1985年と古いので、IBM、HP、DEC、Sperry Univac、Appleなどの名前は見られるが、SunやDELLなどの新興(?)メーカーの名前は無い。また、半導体メーカーでは、Intel、Motorola、Zilogなどの名前はあるが、AMDは入っていない。というように時代の移り変わりを感じるリストである。また、検討の中心的役割を果たしたカリフォルニア大学バークレー校のKahan教授を始めとする大学からのメンバーや、国立アルゴンヌ研究所やローレンスリバモア研究所などの名前も見える。
IEEE以前の浮動小数点データ形式や演算は、Fractionのビット数の範囲の精度で、EXPのビット数で表現できる指数で、十分広い範囲の数が表現できれば、それで良しという感じで作られていたが、IEEEの規格を審議する委員会で数値計算の専門家は、高い精度が得られるデータ表現形式、高い精度が得られる演算を厳密に定義し、今日、IEEE 754規格として知られる浮動小数点演算規格を作成した。
図3:IEEE 754浮動小数点データ
ヒドン(Hidden)ビットで精度を1ビットを稼ぐ
IEEE 754規格では、色々な精度の数値が混じると、結局、一番精度の低いデータで計算の精度が決まってしまうということで、EXPは2倍単位として、IBM Hex形式のように表現する数値によって有効ビット数が変らない形式となっている。このようにEXPの単位を2倍とすることにより、正規化された数値の最上位ビットは必ず”1″になるので、データフォーマット上ではこの”1″をヒドンビット(Hidden Bit)として省略し、1ビット分の精度を稼いでいる。CRAY-1は、Fractionの最上位ビットは常に”1″になるので、これをヒドンビットとすれば1ビット精度を稼げるのであるが、そういうことを考えなかったのか、あるいは、たかが1ビットの精度改善のためにロジックを複雑にしたくなかったのか、そうはなっていない。
図3に示すように、IEEE 754の数値表現は、Hidden Bitの”1″の右に小数点があり、その下にFractionのビットが並ぶという数値に指数EXPと符号Sが付くという構造になっている。単精度のフォーマットでは、指数部は8ビットであり0~255の値を取るが、EXPが127の時に実質の指数はゼロをとなる。このため、127のバイアス(日本語では、127の下駄はかせ)表現と言われる。EXPが127の時、Hidden bitの右に小数点があり、そして、小数点は、EXPが1増加するにつれて1ビットづつ右、1減少するにつれて1ビットづつ左に移動する。これを数式で表すと、
となる。バイアスは、単精度フォーマットでは127であるが、倍精度フォーマットでは1023である。従って、指数部は、単精度の場合は2の128乗と2の-127乗の範囲、倍精度の場合は2の1024乗と2の-1023乗の範囲(但し、後述のように、最大と最小のEXPの値は特別なデータを表わす)となる。また、数値表現の有効桁数は、ヒドンビットがあるので、単精度では23ビット、倍精度では53ビットである。
次の表にIBMのHex形式、CRAY-1の形式とIEEE 754形式の比較を示す。
IEEE754規格の特徴
IBM Hex形式と較べると、Fractionの有効ビット数が一定しているというのがIEEE 754規格による浮動小数点の数値表現の特徴であり、単精度では、最低の有効ビット数の点ではIBM Hexより2ビット精度が高いが、表現できる数値の範囲としては2の128乗(10進数で39桁程度)狭くなっている。一方、倍精度では、最低の有効ビット数は両者とも同じであるが、指数部はIEEEの方が圧倒的に大きく、10進数で230桁以上広くなっている。また、CRAY-1と比較すると表現できる数値の範囲は狭いが、IEEE754規格の範囲で問題になるケースは少なく、有効ビット数が5ビット多い分、精度の高い計算ができる。
このように、IEEE 754規格では、単精度形式は精度重視、倍精度形式は精度と数値の表現範囲のバランスを重視してデータ形式が決定されている。 また、IEEE 754規格では、演算結果に関しては、無限の精度で計算を行い、その結果に対して指定の方法で丸めを行い、結果のデータフォーマットに格納するという場合と同じ値を与えなければならないと規定されている。
例えば、倍精度の乗算の場合は、それぞれのオペランドが53ビットの精度を持っているので、無限精度で計算すれば乗算結果は106ビット長になる。この結果を倍精度で格納する場合には、ヒドンビットを含めて53ビットしか格納できず、下位の53ビットは格納できない。しかし、無限精度で計算することになっているので、切り上げを行う場合は、この下位の53ビットに一つでも”1″があれば、上位の53ビットに”1″を加える必要がある。