仕事で役立つ人気ビジネスアプリおすすめ!
[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
コンピュータアーキテクチャの話 (99) 浮動小数点乗算器
次は、掛け算器である。1200×150は180000であるが、浮動小数点形式で表現すると、1.2×10の3乗と1.5×10の2乗の積であり、1.2×1.5=1.8と、指数部は10の2乗と3乗で10の5乗であり、結果として、1.8×10の5乗と計算する。
このように浮動小数点の乗算は、仮数部(Hidden bitの1.0を補ったFraction)の積の計算と、指数部の加算で実行できる。ここで、指数部は、両方のオペランドの指数部EXPを加算すれば良く、結果の符号は、両方のオペランドの符号SのXORを取れば良い。
正規化された仮数部は1.0以上で2.0未満になっているので、仮数部の積の値は、1.0以上で4.0未満の値となる。積が2.0以上になった場合は、仮数部は1ビット右シフトして正規化し、指数部の和に1を加え必要があるが、これは加算の場合の桁溢れが生じた場合の処理と同じである。
浮動小数点の乗算は、加算のように、桁合わせのための長い右シフトや、結果が桁落ちを起こして、正規化のために長い左シフトを必要とするというような面倒なケースは無く、次の図20に示すような比較的簡単な構成で実現できる。
図20:浮動小数点乗算器の構成。
IEEE 754規格の倍精度浮動小数点の場合は、指数部EXPには1023のバイアスが含まれている。このため、EXPを単純に足し算すると、バイアスが2回含まれてしまうので、指数部の加算を行うアダーではバイアスの1023を引く(実際は-1024+1)という回路になっている。
浮動小数点乗算器の中の大物は、仮数部を掛ける乗算器である。IEEE形式では、Fractionは52ビットであるが、Hidden Bitの”1″を補うと53ビットとなり、最終段のCPA(Carry Propagation Adder)は、ウォレスツリーから出力される106ビットのサム(Sum)とキャリー(Carry)を加算する必要がある。しかし、サイズが大きいだけで、このコラムの78回から83回にかけて説明した整数の乗算器と同じ考え方で設計すれば良い。
なお、浮動小数点乗算も1サイクルで実行するには時間が掛かりすぎるので、加算器の項で説明したように、複数段に分割してパイプラインで実装されるのが普通である。
正規化された入力オペランドの仮数は1.0以上、2.0未満であるので、CPAから出力される積は、1.0以上、4.0未満となる。この値が2.0以上となった場合は、1ビット右シフトして、アダーで生成された指数に1を加えて正規化を行う。また、丸め処理によって最上位桁まで桁上りが伝搬した場合も、同様に、1ビット右シフトと指数部への+1が必要となる。しかし、仮数の最大値はFrac部がオール”1″の、2.0-(2の-52乗)であるので、仮数の積の最大値は、
となる。丸めで足される数は、切り上げる場合でも2の-52乗を超えないので、丸めを行っても4.0以上の数になることはない。つまり、CPAの出力が2.0以上の場合は、結果が1ビット右シフトされることを考慮して、最下位の有効ビット(LSB)の位置で丸めを行なえば良い。そして、CPAの出力が2.0未満の場合は、LSBの1ビット右のガードビットの位置で丸めを行い、両方のケースともに、丸めの結果が2.0を超えている場合は、1ビット右シフトと指数部への+1を行えば良い。
IEEE 754規格に準拠する場合には、積の指数部がオーバーフローして表現できる最大値を超える場合は、結果を∞にしたり、正規の数で表現できる数値より小さくなった場合は、デノーマル数にしたりするなどの処理を実装する必要がある。IEEE 754規格では、これらの処理をハードウェアだけで行うことは要求されていないが、ハードウェアで処理しない場合でも、これらの条件が発生したことを検出する回路を設ける必要がある。そして、トラップなどにより通知して、ファームウェアやソフトウェアでIEEE 754規格に準拠した結果を生成することが必要である。