(57)【特許請求の範囲】
【請求項１】
浮動小数点数をビット列で表現する浮動小数点数データの乗算及び加算を行なうことで積和演算を実行する積和演算装置であって、
前記浮動小数点数データの乗算を行なう乗算手段と、
前記浮動小数点数データの加算を行なう加算手段と、
前記加算手段で行なわれた加算の結果として得られる浮動小数点数データに丸めの処理を施す丸め手段と、
前記浮動小数点数データである第一のデータと第二のデータとの積へ該浮動小数点数データである第三のデータを加算する積和演算の結果が格納される結果格納手段と、
前記第一のデータと前記第二のデータとの乗算の結果である乗算結果データを前記乗算手段に算出させる乗算制御手段と、
前記乗算結果データにおける仮数部を表現するビット列を該仮数部における上位の桁を表現するものと該仮数部における下位の桁を表現するものとの２つに分割したうちの該下位の桁を表現するビット列を仮数部とする下位乗算結果データに、前記第三のデータを加算して得られる第一加算結果データを前記加算手段に算出させる第一加算制御手段と、
前記第一加算結果データに前記上位の桁を表現するビット列を仮数部とする上位乗算結果データを加算して得られる第二加算結果データを前記加算手段に算出させる第二加算制御手段と、
を有し、
前記結果格納手段には、前記第二加算結果データに対する丸めの処理が前記丸め手段によって施されて得られる浮動小数点データである第一の積和演算結果データが格納される、
ことを特徴とする積和演算装置。
【請求項２】
前記上位乗算結果データに前記第三のデータを加算して得られる第三加算結果データを前記加算手段に算出させる第三加算制御手段と、
前記第三加算結果データに前記下位乗算結果データを加算して得られる第四加算結果データを前記加算手段に算出させる第四加算制御手段と、
前記上位乗算結果データと前記第三のデータとの比較を行なう比較手段と、
を更に有し、
前記結果格納手段には、前記比較手段による前記比較の結果に基づき、前記第一の積和演算結果データの代わりに、前記第四加算結果データに対する丸めの処理が前記丸め手段によって施されて得られる浮動小数点データである第二の積和演算結果データが格納される、
ことを特徴とする請求項１に記載の積和演算装置。
【請求項３】
前記乗算手段による乗算の結果若しくは前記加算手段による加算の結果を示す浮動小数点数データにおいて指数部の表現のために割り当てられているビット数を、該乗算若しくは該加算においてオーバーフロー又はアンダーフローが生じたことを示す情報に基づいて拡張する変換を行なう指数部変換手段を更に有し、
前記加算手段で行なわれる加算の対象が前記乗算手段による乗算の結果若しくは該加算手段自身が以前に行なった加算の結果を示すデータであるとき、該加算手段は、前記指数部変換手段による変換が行なわれた後の値が該データにおける指数部の値であるものとして該データの加算を行なう、
ことを特徴とする請求項１に記載の積和演算装置。
【請求項４】
前記加算手段は、該加算手段で行なわれた加算の結果として得られる浮動小数点数データに前記丸め手段が丸めの処理を施すための基とする情報である丸め処理情報を該加算の結果と併せて出力し、
前記丸め手段は、前記第二加算結果データに対して前記丸めの処理を施すときには、前記加算手段が前記第一加算結果データの算出を行なったときに出力された第一の丸め処理情報、及び該加算手段が該第二加算結果データの算出を行なったときに出力された第二の丸め処理情報に基づいて該丸めの処理を施す、
ことを特徴とする請求項１に記載の積和演算装置。
【請求項５】
浮動小数点数をビット列で表現する浮動小数点数データである第一のデータと第二のデータとの積へ該浮動小数点数データである第三のデータを加算する積和演算を実行する積和演算方法であって、
浮動小数点数データの乗算を行なう乗算器に前記第一のデータと前記第二のデータとの乗算を行なわせ、
前記乗算の結果である乗算結果データにおける仮数部を表現するビット列を該仮数部における上位の桁を表現するものと該仮数部における下位の桁を表現するものとの２つに分割したうちの該下位の桁を表現するビット列を仮数部とする下位乗算結果データに前記第三のデータを加算する演算を浮動小数点数データの加算を行なう加算器に行なわせ、
前記加算の結果である第一加算結果データに前記上位の桁を表現するビット列を仮数部とする上位乗算結果データを加算して得られる第二加算結果データを前記加算器に算出させ、
前記第二加算結果データに対して丸めの処理を施して得られたデータを該積和演算の結果とする、
ことを特徴とする積和演算方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、デジタルデータの算術演算を行なう演算装置で用いられる技術に関し、特に、積和演算を行なう演算装置で用いられる技術に関する。
【０００２】
【従来の技術】
まず、ＩＥＥＥ（The Institute of Electrical and Electronics Engineers, Inc. ）の２進浮動小数点算術演算についての規格（ＩＥＥＥ−７５４）における浮動小数点数値の表現形式について、図１４を参照しながら説明する。
【０００３】
図１４の（Ａ）に示すように、浮動小数点数値は、符号ビットＳ、指数部Ｅ、及び仮数部Ｆの３つのフィールドから構成される。
符号ビットＳは数値の正負の符号を示す常に１ビットのデータであり、「０」は正数を、「１」は負数をそれぞれ表す。
【０００４】
仮数部Ｆは１．０以上２．０未満の値（正規化数）を表しており、各ビットは２を負の冪乗した数値を表している。例えば、指数部Ｆの第一番目のビットが「１」のときは２-1、すなわち０．５を表し、第二番目のビットが「１」のときは２-2、すなわち０．２５を表しており、これらの各ビットが表す値の合計に１．０を加算した値が仮数部の値となる。この加算する１．０は、仮数部Ｆに第０番目のビットとして「１」があたかも存在するとみなしたときの２0 の値に対応するものである。このビットには正規化数に対して常に「１」が設定されるので、このビットは実際には仮数部Ｆのフィールドに置かれないが、常に存在するものとして扱われる。このビットは「暗黙の１」などと呼ばれている。
【０００５】
指数部Ｅは２の冪乗の整数値を表すが、この指数部Ｅで負数値の表現を可能とするためにバイアス付き表現が使用される。このバイアスの値は、表現する浮動小数点数値の精度に基づいて予め定義されている。
【０００６】
指数部Ｅに与えられるバイアス値をＢとすると、Ｓ、Ｅ、Ｆ、Ｂによって表現される浮動小数点数値Ｘは下記の式で求められる。
Ｘ＝（−１）S ×２E-B ×（１．０＋Ｆ）
図１４（Ａ）に示す各フィールドに割り当てられるビット数及びバイアスＢの値を表現する浮動小数点数値に定義されている精度ごとに示したものが図１４の（Ｂ）に示す表である。
【０００７】
次に、上述したＩＥＥＥ規格に準拠する、指数部にＮビットが割り当てられ仮数部にＭビットが割り当てられている３つの浮動小数点数Ａ、Ｂ、Ｃについての積和演算Ａ×Ｂ＋Ｃを、正確な中間結果を保ちながら実行することを考える。
【０００８】
このような演算を実行し得る、従来の積和演算器の構成例を図１５に示す。
同図において、加算回路１００１及び仮数部乗算回路１００２がＡとＢとの積算を実行し、その他の回路でＡ×ＢとＣとの加算を実行する。なお、ここではＡ、Ｂ、Ｃの各々の符号の処理は行なわないものとする。
【０００９】
加算回路１００１はＡの指数部の値（指数値）とＢの指数値との加算を行なう回路である。加算回路１００１の入力にはＡ及びＢの値の表現における指数部に割り当てられたビット幅に相当するＮビットのビット幅が用意され、その出力にはここでの加算によっては桁落ちが生じない（Ｎ＋１）ビットのビット幅が用意される。
【００１０】
仮数部乗算回路１００２はＡの仮数部の値（仮数値）とＢの仮数値との加算を行なう回路である。仮数部乗算回路１００２の入力にはＡ及びＢの値の表現における仮数部に割り当てられたビット幅に前述した暗黙の１のための１ビットを加えたものに相当する（Ｍ＋１）ビットのビット幅が用意され、その出力にはここでの乗算によっては桁落ちが生じない（２Ｍ＋２）ビットのビット幅が用意される。
【００１１】
Ａ×Ｂの演算結果とＣとを加算するとき、その両者の指数値が一致していない場合には、桁揃えを行なってから、すなわちそのどちらか一方の仮数値における小数点を移動させて両者の指数値を一致させてから仮数値の加算を行なう必要がある。これらの処理が減算回路１００３、仮数部選択回路１００４、及びアライン回路１００５によって行なわれる。
【００１２】
減算回路１００３はＡ×Ｂの演算結果とＣとでどちらの指数値が大きいかの判定を行なうと共に、その両者の差の値を算出して両者のうちの一方の仮数値の小数点の移動量を求める。
【００１３】
仮数部選択回路１００４は、減算回路１００３から出力されるセレクト信号、すなわちＡ×Ｂの演算結果とＣとのうちでその指数値の大きい方を示す信号に基づき、両者のうち指数値の大きい方についての仮数値を絶対値加算回路１００６の一方の入力へと出力し、小さい方についての仮数値をアライン回路１００５へ出力する。なお、この仮数部選択回路１００４の一方の入力には仮数部乗算回路１００２から送られてくるＡ×Ｂの演算結果の仮数値が入力されるため（２Ｍ＋２）ビットのビット幅が用意されており、他方の入力にはＣの値の表現における仮数部に割り当てられたビット幅に暗黙の１のための１ビットを加えたものに相当する（Ｍ＋１）ビットのビット幅が用意される。また、この仮数部選択回路１００４の２つの出力には、どちらにもＡ×Ｂの演算結果の仮数値がそのまま出力され得るので（２Ｍ＋２）ビットのビット幅が用意されている。
【００１４】
アライン回路１００５は、減算回路１００３から出力されるシフト量情報、すなわちＡ×Ｂの演算結果とＣとのうちで指数値の小さい方についての仮数値の小数点を桁揃えのために移動させるときの移動量を示す情報に基づいて、仮数部選択回路１００４から与えられた仮数値の小数点を移動させ、その移動させた後の仮数値を絶対値加算回路１００６のもう一方の入力へと出力する。なお、このアライン回路１００５の入出力には共に（２Ｍ＋２）ビットのビット幅が用意される。
【００１５】
絶対値加算回路１００６は、仮数部選択回路１００４及びアライン回路１００５から与えられた、桁揃えがなされているＡ×Ｂの演算結果とＣとの仮数値についての（２Ｍ＋２）ビットのビット幅での加算を行なう。
【００１６】
絶対値加算回路１００６によって行なわれるＡ×ＢとＣとの仮数部の加算結果が前述した正規化数の存在範囲を外れてしまうことが生じ得る。正規化回路１００７はそのような加算結果に対して正規化を施す回路であり、この正規化によって行なわれた仮数値の小数点の移動量はシフト量情報として指数部補正回路１０１０へと送られる。なお、正規化回路１００７の入出力にも共に（２Ｍ＋２）ビットのビット幅が用意される。
【００１７】
丸め回路１００８は、正規化回路１００７から出力された（２Ｍ＋２）ビットの仮数部の桁数から有効な精度を有する桁数への丸め、すなわちここでは元のＡ、Ｂ、Ｃの仮数部で示されている（Ｍ＋１）ビットから暗黙の１のための１ビットを減じたＭビットへの変換を行ない、Ａ×Ｂ＋Ｃの積和演算結果の仮数部として出力する。
【００１８】
ここで丸めについて更に説明を加える。丸めの方法には一般に以下の種類がよく知られている。
（１）切り捨て：演算結果のうち、定義されている数値表現形式において仮数部に割り当てられているビット数より下位のビットを切り捨てる。
【００１９】
（２）切り上げ：定義されている数値表現形式において仮数部に割り当てられているビット数で表現し得る値であって、その値の絶対値が演算結果よりも大きく且つ最も近い値とする。
【００２０】
（３）正方向切り上げ：定義されている数値表現形式において仮数部に割り当てられているビット数で表現し得る値であって、その値が演算結果よりも大きく且つ最も近い値とする。
【００２１】
（４）負方向切り上げ：定義されている数値表現形式において仮数部に割り当てられているビット数で表現し得る値であって、その値が演算結果よりも小さく且つ最も近い値とする。
【００２２】
（５）平均値１：定義されている数値表現形式において仮数部に割り当てられているビット数で表現し得る値であって、最も演算結果に近い値とする。もしも、演算結果がそのような値を決められない値であるとき、すなわち仮数部以下第１位ビットが「１」で、それより下のビットが全て「０」のときには、それに最も近い２つの値のうち、仮数部最下位ビットが０（又は１）の方を取る。なお、仮数部以下第１位ビットとは、図１６に示すように、定義されている数値表現形式において仮数部に割り当てられているうちの最下位のビットである仮数部最下位ビットの１つ下の位のビットである。
【００２３】
（６）平均値２：定義されている数値表現形式において仮数部に割り当てられているビット数で表現し得る値であって、最も演算結果に近い値とする。もしも、演算結果がそのような値を決められない値であるとき、すなわち仮数部以下第１位ビットが「１」で、それより下のビットが全て「０」のときには、それに最も近い２つの値のうち、それらの絶対値が大きい（又は小さい）方を取る。
【００２４】
（７）平均値３：定義されている数値表現形式において仮数部に割り当てられているビット数で表現し得る値であって、最も演算結果に近い値とする。もしも、演算結果がそのような値を決められない値であるとき、すなわち仮数部以下第１位ビットが「１」で、それより下のビットが全て「０」のときには、それに最も近い２つの値のうち、大きい（又は小さい）方を取る。
【００２５】
以上のように、丸めには様々な方法があり、演算結果の用途に応じて使い分けられている。
図１５の説明へ戻る。セレクタ１００９は、減算回路１００３から出力されるセレクト信号に基づき、Ａ×Ｂの演算結果とＣとの指数値のうちで大きい方、すなわち、絶対値加算回路１００６で行なわれる仮数値同士の加算における基準である指数値を選択する。
【００２６】
指数部補正回路１０１０は、正規化回路１００７から送られてくるシフト量情報に基づいてセレクタ１００９で選択された指数値の補正を行ない、更に数値表現形式における指数部のために割り当てられているＮビットの値への変換を行なってＡ×Ｂ＋Ｃの積和演算結果の指数値として出力する。
【００２７】
図１５に示す積和演算器は以上のようにしてＡ×Ｂ＋Ｃの積和演算を実行する。
【００２８】
【発明が解決しようとする課題】
上述したように、Ａ、Ｂ、Ｃの各々がとり得る指数値又は仮数値に対して制限を与えることなく上述したＡ×Ｂ＋Ｃの積和演算を行なうためには、まずＡとＢとの積算の結果のために、仮数部では最低でも（２Ｍ＋２）ビット、指数部では最低でも（Ｎ＋１）ビットの精度が必要であり、更に、この積算結果Ａ×Ｂをそのまま次の加算演算のオペランドとしなくてはならなかった。このため、汎用の演算器がこの積和演算を実行可能とするためには、図１５のように、（Ｎ＋１）ビットの指数部減算回路１００３、（Ｎ＋１）ビットからＮビットへの指数部補正回路１０１０、（２Ｍ＋２）ビットの仮数部選択回路１００４、（２Ｍ＋２）ビットのアライン回路１００５、（２Ｍ＋２）ビットの絶対値加算回路１００６、（２Ｍ＋２）ビットの正規化回路１００７、及び丸め演算回路１００８をこのためのみに装備しなければならず、回路実装上での負担が大きかった。
【００２９】
また、この他にも既存の演算器を利用して積和演算を行なう技術が開示されているが（例えば、特開平１０−２０７６９３号公報）、これらの技術では、演算結果が正規化を必要とする場合や、Ａ×Ｂの積算結果とＣとの加算において仮数部からのキャリーアウトが起こる場合などを特殊ケースと見なし、その特殊ケースを対処する特別な処理を行なうようにしており、この特別な処理の実行は演算のレイテンシを長くさせてしまうため、これらの技術では不向きな演算が存在していた。例えば、非除数Ｘを除数Ｙで除算したときの剰余を連続して求めるには、まず、非除数Ｘを除数Ｙで除算したときの商の整数部Ｚを求め、その後にＸ−Ｚ×Ｙなる計算を実行してその剰余を得る計算が一般に実行されるが、このような演算では特に除算演算の実行後において正規化処理が高い確率で発生するため、ほとんどの場合が例外処理となり、演算のレイテンシを長くさせてしまっていた。
【００３０】
以上の問題を鑑み、浮動小数点数積和演算について十分な演算精度を有する演算装置を少ない回路規模の増加で実現することが本発明が解決しようとする課題である。
【００３１】
【課題を解決するための手段】
本発明の態様のひとつである積和演算装置は、浮動小数点数をビット列で表現する浮動小数点数データの乗算及び加算を行なうことで積和演算を実行する装置を前提とし、この装置に、前記浮動小数点数データの乗算を行なう乗算手段と、前記浮動小数点数データの加算を行なう加算手段と、前記加算手段で行なわれた加算の結果として得られる浮動小数点数データに丸めの処理を施す丸め手段と、前記浮動小数点数データである第一のデータと第二のデータとの積へ該浮動小数点数データである第三のデータを加算する積和演算の結果が格納される結果格納手段と、前記第一のデータと前記第二のデータとの乗算の結果である乗算結果データを前記乗算手段に算出させる乗算制御手段と、前記乗算結果データにおける仮数部を表現するビット列を該仮数部における上位の桁を表現するものと該仮数部における下位の桁を表現するものとの２つに分割したうちの該下位の桁を表現するビット列を仮数部とする下位乗算結果データに、前記第三のデータを加算して得られる第一加算結果データを前記加算手段に算出させる第一加算制御手段と、前記第一加算結果データに前記上位の桁を表現するビット列を仮数部とする上位乗算結果データを加算して得られる第二加算結果データを前記加算手段に算出させる第二加算制御手段と、を有し、前記結果格納手段には、前記第二加算結果データに対する丸めの処理が前記丸め手段によって施されて得られる浮動小数点データである第一の積和演算結果データが格納されるように構成することによって前述した課題を解決する。
【００３２】
ここで、前記浮動小数点数データの表現形式は、例えば、ＩＥＥＥ（The Institute of Electrical and Electronics Engineers, Inc. ）の２進浮動小数点算術演算についての規格であるＩＥＥＥ−７５４規格に準拠しているものとする。
【００３３】
上記の構成によれば、第一のデータと第二のデータとの乗算結果を、その仮数部における上位の桁を仮数部とするデータとその仮数部における下位の桁を仮数部とするデータとの２つに分け、これらと第三のデータとの加算を２回に分けて行なうようにしたので、乗算結果がそのままのビット幅で加算手段に入力する構成を採る場合に比べて加算手段の回路規模が小さくなり、また乗算手段から加算手段へデータを転送するバスのビット幅も少なくなるので、回路規模の増大が抑制される。
【００３４】
また、加算手段における加算の順序について、乗算結果の仮数部における下位の桁を仮数部とするデータと第三のデータとの加算を先に行なうようにしたので、乗算結果の仮数部における上位の桁を仮数部とするデータと第三のデータとの加算を先に行なうとその加算の途中で行なわれる仮数部の桁揃えのために消失してしまう可能性のある第三のデータの下位部分が消失することなく、十分な演算精度を有することができる。
【００３５】
なお、上述した本発明に係る積和演算装置において、前記上位乗算結果データに前記第三のデータを加算して得られる第三加算結果データを前記加算手段に算出させる第三加算制御手段と、前記第三加算結果データに前記下位乗算結果データを加算して得られる第四加算結果データを前記加算手段に算出させる第四加算制御手段と、前記上位乗算結果データと前記第三のデータとの比較を行なう比較手段と、を更に有し、前記結果格納手段には、前記比較手段による前記比較の結果に基づき、前記第一の積和演算結果データの代わりに、前記第四加算結果データに対する丸めの処理が前記丸め手段によって施されて得られる浮動小数点データである第二の積和演算結果データが格納されるように構成することもできる。
【００３６】
第一加算結果データと上位乗算結果データと加算して第二加算結果データを得る後の加算において正規化を行なう必要が生じた場合には、先に行なわれた第一加算結果データを算出するための加算の際に桁揃えのために切り捨てられてしまった下位の桁の値に関する情報が必要になるが、この順序で和を求めるときには、後の加算のときに既に下位の桁の値は消失してしまう。そこで、このような場合が生じるか否かを比較手段を用いて先に判定するようにし、このような場合が生じるときには上位乗算結果データと第三のデータとから第三加算結果データを得る加算を先に行ない、第三加算結果データと下位乗算加算結果データとから第四加算結果データを得る加算を後に行なうようにして、この問題を解消するものがこの発明である。
【００３７】
なお、ここで、前記比較手段による比較の結果が前記上位乗算結果データと前記第三のデータとの符号が一致していることを示しているときには、前記結果格納手段には前記第一の積和演算結果データが格納されるように構成することができる。
【００３８】
また、前記比較手段による比較の結果が前記上位乗算結果データと前記第三のデータとの符号が異なっていることを示しているときには、該比較の結果が、該上位乗算結果データで表現されている指数部の値と該第三のデータとの指数部の値とが一致していることを示している場合、若しくは、該上位乗算結果データで表現されている指数部の値と該第三のデータとの指数部の値との差が１であって且つ該乗算結果データと該第三のデータとでそれぞれ表現されている指数部の値のうち大きい方のものについての仮数部を表現しているビット列のうちの最上位のビットが０である場合には前記第二の積和演算結果データが格納され、その他の場合には前記第一の積和演算結果データが格納されるように構成することができる。
【００３９】
また、前述した本発明に係る積和演算装置において、前記乗算手段による乗算の結果若しくは前記加算手段による加算の結果を示す浮動小数点数データにおいて指数部の表現のために割り当てられているビット数を、該乗算若しくは該加算においてオーバーフロー又はアンダーフローが生じたことを示す情報に基づいて拡張する変換を行なう指数部変換手段を更に有し、前記加算手段で行なわれる加算の対象が前記乗算手段による乗算の結果若しくは該加算手段自身が以前に行なった加算の結果を示すデータであるとき、該加算手段は、前記指数部変換手段による変換が行なわれた後の値が該データにおける指数部の値であるものとして該データの加算を行なうように構成することもできる。
【００４０】
この構成によれば、前記乗算手段及び前記加算手段のそれぞれから出力される加算結果若しくは乗算結果で表現し得る指数値の範囲が制限されているときでも、その制限が積和演算に及ぼす精度の低下の影響を低減することができる。
【００４１】
また、前述した本発明に係る積和演算装置において、前記加算手段は、該加算手段で行なわれた加算の結果として得られる浮動小数点数データに前記丸め手段が丸めの処理を施すための基とする情報である丸め処理情報を該加算の結果と併せて出力し、前記丸め手段は、前記第二加算結果データに対して前記丸めの処理を施すときには、前記加算手段が前記第一加算結果データの算出を行なったときに出力された第一の丸め処理情報、及び該加算手段が該第二加算結果データの算出を行なったときに出力された第二の丸め処理情報に基づいて該丸めの処理を施すように構成することもできる。
【００４２】
この構成は、例えば、前記丸め処理情報は、前記加算手段による加算の対象とする２つの浮動小数点数データのうちのいずれかの仮数部の値に対し、仮数部の値の加算のために施される桁揃えによって切り捨てられたビット列のうちの最上位のビットであるガードビット、該最上位のビットの下の桁である第二位のビットであるラウンドビット、及び該第二位のビットの下の桁以降の全てのビットの論理和を示すビットであるスティッキービットとを有し、前記丸め手段は、前記第二加算結果データに対して前記丸めの処理を施すときには、前記第一の丸め情報におけるガードビットと前記第二の丸め情報におけるガードビットとの論理和、該第一の丸め情報におけるラウンドビットと該第二の丸め情報におけるラウンドビットとの論理和、及び該第一の丸め情報におけるガードビットとラウンドビットとスティッキービットと該第二の丸め情報におけるスティッキービットとの論理和、に基づいて該丸めの処理を施すように構成する。
【００４３】
この構成によれば、第一のデータと第二のデータとの乗算結果を、その仮数部における上位の桁を仮数部とするデータとその仮数部における下位の桁を仮数部とするデータとの２つに分け、これらと第三のデータとの加算を２回に分けて行なうようにしたことが丸め手段による丸め処理に対して及ぼす影響を除外することができるようになり、その影響に起因する積和演算結果の精度の低下を防止することができる。
【００４４】
また、本発明の別の態様のひとつである積和演算方法は、浮動小数点数をビット列で表現する浮動小数点数データである第一のデータと第二のデータとの積へ該浮動小数点数データである第三のデータを加算する積和演算を実行する方法を前提とし、浮動小数点数データの乗算を行なう乗算器に前記第一のデータと前記第二のデータとの乗算を行なわせ、前記乗算の結果である乗算結果データにおける仮数部を表現するビット列を該仮数部における上位の桁を表現するものと該仮数部における下位の桁を表現するものとの２つに分割したうちの該下位の桁を表現するビット列を仮数部とする下位乗算結果データに前記第三のデータを加算する演算を浮動小数点数データの加算を行なう加算器に行なわせ、前記加算の結果である第一加算結果データに前記上位の桁を表現するビット列を仮数部とする上位乗算結果データを加算して得られる第二加算結果データを前記加算器に算出させ、前記第二加算結果データに対して丸めの処理を施して得られたデータを該積和演算の結果とすることで前述した本発明に係る積和演算装置と同様の作用・効果が得られ、前述した課題を解決することができる。
【００４５】
【発明の実施の形態】
以下、本発明の実施の形態を図面に基づいて説明する。
まず、本実施の形態の原理を説明する。なお、以下の説明では、ＩＥＥＥ規格に準拠する、指数部にＮビットが割り当てられ仮数部にＭビットが割り当てられている３つの浮動小数点数Ａ、Ｂ、Ｃについての積和演算Ａ×Ｂ＋Ｃを実行する演算装置を、既存のＩＥＥＥ浮動小数点数演算器を改良して実現することについて説明する。
【００４６】
まず、この演算器に入力されるオペランドＡとＢとの乗算を行なう乗算演算部について説明する。
この乗算演算部に入力される値の仮数部はＭビットであるが、ＩＥＥＥ浮動小数点数の表現形式では仮数部最上位ビットの上に暗黙の１である１ビットが省かれているため、実際にはそれを加えた（Ｍ＋１）ビットが仮数乗算の対象となる。また、その乗算演算部の有している乗算器による演算結果は（２Ｍ＋２）ビットで表されることとなるが、ＩＥＥＥ浮動小数点数の表現形式に準拠させるとそこから暗黙の１である１ビットが取り除かれるので、この乗算器から出力される演算結果の仮数部は（２Ｍ＋１）ビットを有することとなる。
【００４７】
なお、既存の浮動小数点数演算器の乗算演算部では、前述したような仮数値に対する丸め処理が回路内部で行なわれるように構成されているためそのようなビット数の演算結果を出力しないものもある。しかし、そのような乗算演算部であっても、正確な丸め演算を行なうために、内部の乗算器自体では（２Ｍ＋２）ビットからなる正確な積算結果を得ているのが通常であるため、この段階の積算結果を取り出すようにすればこのような乗算演算部を流用する場合であっても正確な演算結果の仮数値を得ることが可能である。
【００４８】
一方、この乗算演算部において、オペランドＡ、Ｂの指数部についての演算はＮビット同士の加算となり、その結果は（Ｎ＋１）ビットで表現可能である。但し、本実施の形態の演算装置の出力を、積和演算Ａ×Ｂ＋Ｃに関してはＩＥＥＥ浮動小数点数の表現形式に準拠せずに、（Ｎ＋１）ビットの指数値を得るようにするためには、この乗算演算部の後段に設けられる演算部に適当な変更を加える必要がある。
【００４９】
この乗算演算部がＩＥＥＥ浮動小数点数の表現形式に則りＮビットの指数値を出力するのであれば、Ａ×ＢとＣとの加算を行なう前に、まず、乗算演算部から出力される、演算結果におけるＮビットの指数値と指数オーバーフロー及び指数アンダーフローを示す信号とから以下のような操作を加えて（Ｎ＋１）ビットの指数値を得るための回路を設ける。
【００５０】
通常、乗算演算部において指数オーバーフローや指数アンダーフローが生じたときの出力である演算結果の指数値は補正が施されている。この指数補正では、予め定義されている指数部のビット数では表現しきれなくなった浮動小数点数を、定数βで除算又は乗算して指数値を調整する。指数オーバーフローが生じたときはその値をβで除し、指数アンダーフローが生じたときはその値にβを乗じる。ここで、βは、指数オーバーフロー又は指数アンダーフローが生じたときにとり得る全ての指数値について、定義されているビットで表現し得る範囲に収める値とされる。
【００５１】
次に、前述した乗算演算部の内部で指数補正処理が施された後のＮビットの指数値と、その乗算演算部から出力されるオーバーフロー又はアンダーフローの信号とから、（Ｎ＋１）ビットに拡張した指数値を得る手法について具体的に説明する。なお、この手法では、指数値に与えられている前述したバイアス値もその指数部に割り当てられているビット数に応じて変更する。
【００５２】
変換前のバイアス込みのＮビットからなる指数値をＥ１、変換後のバイアス込みの（Ｎ＋１）ビットからなる指数値をＥ２とし、変換前のＮビットからなるバイアスをＢ１、変換後の（Ｎ＋１）ビットからなるバイアスをＢ２、乗算演算部の指数補正処理において使用されていた定数βを２のα乗（但し、αはＮビットの数値）とすると、
0003845009.tif 000002
が指数値の変換式になる。これらの式を、後の説明の都合上、指数値変換式と称することとする。
【００５３】
この指数値変換式において、Ｎビットの値については、最上位ビットが「０」である（Ｎ＋１）ビットの値であるとみなして（Ｎ＋１）ビットでの加減算を行なう。なお、上記の各式における右辺の括弧内の値は全て定数であるので、この指数値の変換では、上記の括弧内の演算を予め行なっておき、その結果として得られた定数を変換前の指数値に加算するだけで得られる。
【００５４】
この変換によって得られた（Ｎ＋１）ビットの指数値で表現し得る数値の範囲は、図１に示すように、変換前のＮビットの指数値で表現し得る数値の範囲に対して大幅に広がる。
【００５５】
次に、Ａ×ＢとＣとの加算を行なう回路について説明する。
既存のＩＥＥＥ浮動小数点数演算器の有する加算演算部における指数部の入力は一般的にＮビットのビット幅を有しているが、上述した変更によって乗算演算部から出力される演算結果における指数部のビット数が通常より１ビット増えたため、このままではＡ×ＢとＣとの加算が実行できない。そこで、この加算演算部に変更を加える。
【００５６】
まず、Ａ×ＢとＣとの大小比較、及び仮数値の桁揃えのためのシフト量を求めるための減算器（前述した図１５における減算回路１００３に相当する回路）を、（Ｎ＋１）ビット入力が行なえるように変更する。
【００５７】
次に、Ａ×Ｂの乗算結果の値における（２Ｍ＋１）ビット仮数部を、Ｍビットの高位部分と、（Ｍ＋１）ビットの低位部分とに単純に分割し、それぞれ同じ精度を有する浮動小数点数Ｈ、Ｌの仮数部とする。これは、Ａ×Ｂの演算結果とＣとの仮数値の加算を行なう回路として（２Ｍ＋１）ビットの加算器を用いることは回路規模の増大に繋がるので、予めＡ×Ｂの演算結果の仮数値をその上位部分と下位部分とに分割するようにし、これらとＣの仮数値との加算を求めるようにすることによってその回路規模の増大を抑えることを意図して行なうものである。
【００５８】
ところが、Ｌの仮数値は乗算結果の値の仮数値の下位を切り取っただけなので、このままではＩＥＥＥ浮動小数点数の表現形式に沿ったものとはならない。これをＩＥＥＥ浮動小数点数の表現形式に準拠したものとするためには、（Ｍ＋１）ビットの低位部分における最も左の、すなわち最も上位のビット位置のひとつ上の位置の値が暗黙の１となるように左シフトを行ない、更にその暗黙の１を切り取る必要がある。
【００５９】
また、Ｈの指数部についてはＡ×Ｂの乗算結果の値における（Ｎ＋１）ビットの指数部に何ら変更を加える必要はないが、Ｌの指数部は、仮数部に対して行なわれた左シフトの量に応じた値の修正が必要となる。このときのＬの指数値は、仮数部に対して行なわれた左シフトの量をＺとすると、次式で求めることができる。
【００６０】
（Ｌの指数値）＝（Ｈの指数値） −（Ｍ＋１＋Ｚ）
なお、上式において、Ｈの指数値がＭ＋１以下のときにはＬの指数値が負になってしまう場合があるが、この場合はＬの指数値を０とする。このようにすると、Ｌは実際の値と異なるものになってしまうが、この値でもその後の演算が正しく行われることは保証される。このことについて説明する。
【００６１】
ＨとＬの指数部には（Ｎ＋１）ビットが割り当てられており、このときのバイアス値がＢ２である。また、Ｃの指数部にはＮビットが割り当てられており、バイアス値がＢ１である。
【００６２】
ここで、仮にＣの指数値が、表現し得る最小の値を示す「０」で、Ｈの指数値が「Ｍ＋１」であるとすると、ＣとＨの指数値の差は、
（０−Ｂ１）−（Ｍ＋１−Ｂ２）＝Ｂ２−Ｂ１−Ｍ−１
となる。通常、バイアス値はその指数部がとり得る最大値のほぼ２分の１の値が与えられるので、上式のＢ１及びＢ２にこの値を代入すると、
0003845009.tif 000003
これは、例えば図１４に示す表の数値を用いれば、単精度なら１０４、倍精度なら９７１、拡張精度なら１６２７１となる。つまり、Ｃがその精度内で最も小さい値を取っても、Ｈの指数値がＭ以下のときであればＡ×Ｂの演算結果はＣに比べて十分小さなものであり、無視し得る程度の大きさのものとなっていることを意味する。つまり、少なくともＡ×Ｂ＋Ｃの演算結果をＡ、Ｂ、Ｃを同一の精度で求める限りにおいては、Ｌの指数値の多少のずれはそれほど重要ではないといえるのである。
【００６３】
このようなデータ操作を行なう回路を加算演算部に追加する。
以上までに説明した、Ａ×Ｂの乗算結果の値における仮数値についての分割の様子を図２に示す。
【００６４】
図２において、（１）にはＩＥＥＥ規格に準拠する、指数部にＮビットが割り当てられ仮数部にＭビットが割り当てられている浮動小数点数Ａ、Ｂが示されており、これらの各々から仮数部が抽出されて暗黙の１が付された様子が（２）に示されている。そして、これらの乗算結果の仮数部は、（３）に示すように、暗黙の１と（２Ｍ＋１）ビットで表現される。その後、（４）に示すように、この仮数部がＭビットからなる高位部分と（Ｍ＋１）ビットからなる低位部分とに分割される。そして、（５）に示すように、高位部分はこのままＩＥＥＥ規格に準拠する浮動小数点数Ｈとなり、低位部分は左方向へのビットシフトが行なわれ更に暗黙の１が削除されてＩＥＥＥ規格に準拠する浮動小数点数Ｌとなる。但し、このＬの仮数部には（Ｍ＋１）ビットが割り当てられ、Ｌの指数部にはビットシフトの量に応じた値の修正が行なわれる。
【００６５】
次にＡ×Ｂの演算結果とＣとの加算を行なう加算器について説明する。
前述したように、この加算器では、Ｃ、Ｈ、Ｌの３つの浮動小数点数の加算を２回に分けて行なうのであるが、既存の浮動小数点数演算器の加算演算部では暗黙の１を含む（Ｍ＋１）ビットの加算にしか対応していないため、この加算演算部で加算を行なうと（Ｍ＋１）ビットで表現可能な桁より下位の桁の値に対しては丸め処理が施され、切り捨てられてしまう。そこで、本発明においては、原則としてＬについての加算を先に行なうようにする。つまり、本実施形態では、通常はＣとＬとの加算を先に行なってその結果とＨの加算を後に行なうようにする。
【００６６】
ところが、後で行なう加算において正規化を行なう必要が生じた場合には、先に行なわれたＣについての加算で丸め処理により切り捨てられてしまった下位の桁の値に関する情報が必要になるが、上記の順で和を求めると、後の加算のときにはすでに下位の桁の値は丸め処理によって失われてしまっている。そこで、このような場合が生じるか否かを先に判定するようにし、このような場合が生じるときには加算の順番を逆にする。つまり、本実施形態においては、この場合にはＣとＨとの加算を先に行ない、その結果とＬの加算とを後に行なうようにする。
【００６７】
以下、上述した手法の詳細について説明する。
まずは通常の場合から説明する。ＨとＣとの符号が同じであるか、または、ＨとＣの符号が異なり且つＨの指数値とＣの指数値との差が１以上（但し、Ｈの指数値とＣの指数値との差が１で且つ両者のうち指数値が大きい方の仮数値の最上位ビットが０の場合を除く）の場合には、加算結果の値における仮数値に対する正規化が生じないか、または起こったとしても高々１ビットのビットシフトによる正規化が生じるに過ぎないので、特段の処理は不要である。そこで、この場合にはＬとＣとの加算を先に行ない、その結果とＨとの加算を後に行なうという順番で和を求める。
【００６８】
ここで、上述した加算を行なう加算器は、図３に示すように、加算演算の中間結果として、仮数部の最下位ビットの下の第一番目のビットであるＧビット（Guard ビットなどとも称されている）、第二番目のビットであるＲビット（Roundビットなどとも称されている）、及び第三番目以下の全てのビットの論理和を取ったビットであるＫビット（Stickyビットなどとも称されている）を出力するように構成する。
【００６９】
通常の加算演算部ではこのＧＲＫビットに基づいて演算結果の仮数値に丸めの処理を施したものが出力されるので、演算結果にはＧＲＫの値は現れない。しかし、ここで使用する加算器では、このような丸めの処理が施される前の加算結果の仮数値が出力されるようにし、更にＧＲＫの各ビットの値も出力されるように既存のＩＥＥＥ浮動小数点数演算器に変更を加える。なお、このＧＲＫの各ビットは、加算対象である２つの仮数値のうちの一方を桁揃えのためにビットシフトさせたときに求めることができる。
【００７０】
この第一の加算結果、すなわちＬとＣとの加算結果をＰとする。このＰはＮビットからなる指数値と、Ｍビットからなる仮数値と、ＧＲＫの各ビットを有するものとする。本来、このＰの値としては仮数値としてビット幅に制限のない値を持つことができるように構成するべきだが、回路規模の要請を考慮し、ＰがＧＲＫの各ビットの値を持つことでこれを補うようにするのである。またこのとき指数値がＮビットとなるのは、既存のＩＥＥＥ浮動小数点数演算器をそのまま流用することにより指数補正が行なわれることによるものである。したがって、前述した乗算演算部からの演算結果の指数値に対して行なったものと同様の（Ｎ＋１）ビットへの変換をここでも行なう必要がある。
【００７１】
次に、指数値が（Ｎ＋１）ビットに変換されたＰとＨとを、先の加算演算を行なわせたものと同一の加算器に入力して第二の加算結果を求めさせる。
ここで、Ｐの指数値がＨの指数値よりも大きい場合には、Ｈの仮数値に対して桁揃えの処理が行なわれ、このときＨについてのＧＲＫの各ビットが生成される。このＨについてのＧＲＫの各ビットをＧ’Ｒ’Ｋ’と示すこととする。
【００７２】
ところで、この場合では、先に行なわれた第一の加算においてＰにも既にＧＲＫが存在している。このように両オペランドにＧＲＫが存在するときには、Ｋビットの基である仮数部の最下位ビットの下の第三番目以下の桁のビットからの繰り上がりの様子が予測できないため演算が破綻してしまう。
【００７３】
例えば、仮数部の最下位ビット以下が２進で１０１１０…である値Ｘと、００１００…である値ＹとについてＸ＋Ｙを求めると、その加算結果の仮数部最下位ビット以下の値は１１０１０…となる。このとき、Ｘ、Ｙ、Ｘ＋ＹについてのＧＲＫの各ビットの値はそれぞれ「１０１」、「００１」、「１１１」である。
【００７４】
同様に、仮数部の最下位ビット以下が２進で１００１０…である値Ｘ'と、０００１０…である値Ｙ'とＸ'＋Ｙ'を求めると、その加算結果の仮数部最下位ビット以下の値は１０１００…となる。このとき、Ｘ’、Ｙ’、Ｘ’＋Ｙ’についてのＧＲＫの各ビットの値はそれぞれ「１０１」、「００１」、「１０１」である。
【００７５】
つまり、Ｘ及びＸ’と、Ｙ及びＹ’とのＧＲＫの各ビットの値はそれぞれ同じであるにもかかわらず、Ｘ＋ＹとＸ’＋Ｙ’とのＧＲＫの各ビットの値は異なってしまう。この結果は、Ｘ＋ＹについてはＫビットの基である桁からの繰り上がりがあるが、Ｘ’＋Ｙ’についてはその桁からの繰り上がりがないために生じたものである。しかも、この繰り上がりの発生は、仮数部以下の正確な値を保持しなくては予測できない。
【００７６】
ところが、今回の計算ではその繰り上がりがないことが保証されている。このことについて説明する。
まず、Ｐの指数値がＨの指数値よりも大きいときは、第一の加算を行なう以前の浮動小数点数Ｃ、Ｈ、Ｌの大きさの関係は、Ｃが一番大きく、その後にＨ、Ｌとなるのは明らかである。
【００７７】
また、Ｃ及びＨに割り当てられている桁数の関係を考慮すれば、この場合におけるＣ、Ｈ、Ｌの仮数値は図４に示すような関係となっているはずである。つまり、第一の加算結果であるＰはＬとＣとの和であるから、このＰの仮数値は結局Ｃの仮数値をそのまま引き継いだものに過ぎないのである。また、このときのＰにおけるＧＲＫの各ビットはＬの仮数値に基づいて作成されていることも明らかである。
【００７８】
ここで、Ｐの方がＨよりも大きいので、第二の加算における桁揃えではＨの仮数値の右シフトが行われる。従って、Ｈの仮数部の最下位ビット以下にある部分に基づいてＧ’Ｒ’Ｋ’が生成される。
【００７９】
ところで、ＨとＬとはＡ×Ｂの演算結果の値の仮数値を２つに分割したものであるから、ＨとＬとの仮数値において同一桁の重複が存在することはない。しかも、上述したように、ＧＲＫの各ビットはＬより、一方Ｇ’Ｒ’Ｋ’の各ビットはＨよりそれぞれ生成されることから、これらのＧＲＫとＧ’Ｒ’Ｋ’との各ビットが互いに重複している部分はないといえる（図４参照）。
【００８０】
以上のことから、ＰとＨとの加算においては、Ｋビットの基である桁からの繰り上がりは生じないといえ、更に、ＧとＲとからの繰り上がりも生じないといえる。よって、第二の加算結果の値についての最終的なＧＲＫの各ビットの値（この値をそれぞれＧ''、Ｒ''、Ｋ''とする）は、Ｇ''＝Ｇ’∪Ｇ、Ｒ''＝Ｒ’∪Ｒ、Ｋ''＝Ｋ’∪Ｋという演算によって求めてよいことが分かる。
【００８１】
上述した論理演算によりこのＧ''Ｒ''Ｋ''の各ビットの値を求め、これらの値に基づいて第２の演算結果の値に丸めの処理を施したものをＡ×Ｂ＋Ｃの積和演算の最終結果として出力する。
【００８２】
なお、Ｈの指数値がＰの指数値よりも大きい場合には、Ｐに対して桁揃えが施されるので、新たなＧＲＫの各ビットの値が生成されるが、その後の計算は通常の加算と同じように、新たに求められたＧＲＫの各ビットの値に基づいて丸めの処理を加算演算の結果に対して施し、これを積和演算の最終結果とする。
【００８３】
次に、前述した通常の場合から外れる場合、すなわち、ＨとＣの符号が異なる場合であってＨの指数値とＣの指数値とが一致している場合、または、ＨとＣの符号が異なる場合であってＨの指数値とＣの指数値との差が１であり且つ両者のうち指数値が大きい方の仮数値の最上位ビットが０である場合について説明する。
【００８４】
上述した場合では、Ａ×Ｂの演算結果とＣとの加算を行なったときに必ず１ビット以上の正規化を行なう必要が生じる。
このような場合にＬとＣとの加算を先に行なうと、この第一の加算のときに演算結果に施される丸めの処理と、その後の第一の加算結果とＨとの和の演算結果に施される正規化によって、所定の精度を維持するために必要な情報が失われてしまうことになる。そのため、前述した通常の場合とは逆の順番、すなわちＨとＣとを上述した加算器に入力してＮビットの指数部とＭビットの仮数部とからなる第一の加算結果Ｐを先に求める。この第一の加算では１ビット以上の正規化が生じるが、２つのオペランドの指数値の差は１以内に過ぎないので桁揃えのためのビットシフトは発生しないためＧＲＫは発生しない。よって、このときＰとＬとを加算する第二の加算では、通常の加算と同じように、第一の演算結果Ｐの指数部を（Ｎ＋１）ビットに変換したものとＬとを第一の加算において用いられたものと同一の加算器に入力して第二の加算結果とそのときのＧＲＫの各ビットの値を求めればよい。そしてその後、このＧＲＫを基に第二の演算結果に丸めの処理を施し、その結果得られた値を積和演算の最終結果とするようにする。
【００８５】
以上の原理に沿った積和演算を行なえる演算装置の具体的な構成例について説明する。
図５は本発明を実施する演算装置の構成を示す図である。この演算装置は、ＩＥＥＥの倍精度浮動小数点数についての規格に準拠する、符号に１ビットが割り当てられ指数部に１１ビットが割り当てられ仮数部に５２ビットが割り当てられている計６４ビットからなる３つの浮動小数点数Ａ、Ｂ、Ｃについての積和演算Ａ×Ｂ＋Ｃを、以上までに説明した原理に従って実行するものである。なお、ここでは説明を簡単にするために、Ａ×Ｂの演算結果とＣとの符号は一致しているものとする。
【００８６】
ＯＰ１Ｒ（ＯＰ１レジスタ）１０９及びＯＰ２Ｒ（ＯＰ２レジスタ）１１０は浮動小数点乗算器１１２または浮動小数点加算器１１３のいずれかに入力する数値データが格納されるレジスタである。これらのうち、ＯＰ１Ｒ１０９については６４ビットのビット幅を有するように構成する。また、ＯＰ２Ｒ１１１０のビット幅については後述する。
【００８７】
ＲＲ（リザルトレジスタ）１１１は、浮動小数点乗算器１１２または浮動小数点加算器１１３のいずれかから出力される演算結果である数値データが格納されるレジスタである。
【００８８】
これらのＯＰ１Ｒ１０９、ＯＰ２Ｒ１１０、及びＲＲ１１１の各レジスタに格納される数値データの選択はレジスタ制御回路１０５によって制御される。
Ａ×Ｂの演算を実行するのであれば、Ａ及びＢの値がそれぞれＯＰ１Ｒ１０９及びＯＰ２Ｒ１１０に格納された状態で浮動小数点乗算器１１２が乗算命令に従って動作するとその演算が実行され、その演算結果がＲＲ１１１に格納される。
【００８９】
ここで図６について説明する。同図は図５における浮動小数点乗算器の詳細構成を示している。この浮動小数点乗算器１１２はＩＥＥＥ浮動小数点数の乗算に対応しており、仮数部乗算器２０２は仮数部の正確な乗算結果を算出し、その乗算結果を格納する１０６ビットの仮数部乗算結果レジスタ２１１を有している。
【００９０】
通常の乗算であれば、この仮数部乗算結果レジスタ２１１に格納されたデータは丸め演算回路２１２へ送られて丸め処理が施された後、暗黙の１を含めた上位５３ビットの数値データのみが仮数値として出力され、残された下位ビットのデータは棄てられる。これに対し、浮動小数点数Ａ、Ｂ、Ｃについての積和演算Ａ×Ｂ＋Ｃについては、仮数部乗算結果レジスタ２１１に格納されたデータに対して丸め演算回路２１２による丸め処理が施されることなく、上述した下位ビットのデータを廃棄することなく出力するためのバスが仮数部乗算結果レジスタ２１１に追加される。
【００９１】
具体的には、仮数部乗算結果レジスタ２１１に格納された１０６ビットのデータのうちの上位の５３ビットから暗黙の１を除いた５２ビットの仮数部データについての浮動小数点数値データＨと、仮数部乗算結果レジスタ２１１に格納されたデータのうちの下位の５３ビットの仮数部データについての浮動小数点数値データＬとを出力するようにし、このＨ及びＬの出力を２回に分けてＲＲ１１１に格納するようにする。
【００９２】
ここで、Ｈ及びＬの符号ビットには、Ｅｘ−ＯＲ（Exclusive-ＯＲ）２１３によって求められてＳレジスタ（符号レジスタ）２０４に格納されている、ＯＰ１Ｒ１０９及びＯＰ２Ｒ１１０にそれぞれ格納されたデータにおける符号ビットについての排他的論理和の値が与えられる。
【００９３】
また、Ｈの指数部には、指数部演算部２０１によって求められて上位データ用指数値レジスタ２０７に格納されている、ＯＰ１Ｒ１０９及びＯＰ２Ｒ１１０にそれぞれ格納されたデータにおける指数値の加算結果が与えられる。更に、Ｌの指数部には、加算器２０３によって求められて下位データ用指数値レジスタ２１０に格納されている、ＯＰ１Ｒ１０９及びＯＰ２Ｒ１１０にそれぞれ格納されたデータにおける指数値の加算結果から「−５３」を減じた値が与えられる。この加算器２０３による「−５３」の加算は、Ｈの値を基準としたときのＬの値の桁揃えを行なうためのものである。
【００９４】
以上のようにしてＨ及びＬは求められるが、図５においては浮動小数点乗算器１１２に乗算結果レジスタ１１４を示し、乗算結果がこのＨ及びＬが乗算結果レジスタ１１４に格納されるものとして示している。
【００９５】
また、この浮動小数点乗算器１１２からは、Ｈ及びＬに加え、Ｈについてのオーバーフロー及びアンダーフローの情報として、上位データ用オーバーフローレジスタ２０５に格納されている、指数部演算部２０１による加算によってオーバーフローが生じたことを示すデータＯＦＨと、上位データ用アンダーフローレジスタ２０６に格納されている、指数部演算部２０１による加算によってアンダーフローが生じたことを示すデータＵＦＨとが出力され、更に、Ｌについてのオーバーフロー及びアンダーフローの情報として、下位データ用オーバーフローレジスタ２０８に格納されている、加算器２０３による加算によってオーバーフローが生じたことを示すデータＯＦＬと、下位データ用アンダーフローレジスタ２０９に格納されている、加算器２０３による加算によってアンダーフローが生じたことを示すデータＵＦＬとが出力される。
【００９６】
これらのオーバーフロー及びアンダーフローの情報は、既存の演算装置であれば一旦ラッチされた後にＣＰＵ等の制御ユニットにその情報が報告されるのであるが、この演算装置においてＡ×Ｂ＋Ｃの積和演算を実行するときには、Ａ×ＢとＣとについての２回に分けて行なわれる加算においてもこれらの情報が用いられるため、これらの情報を適切なタイミングで浮動小数点加算器１１３に提供できるようにするための回路が必要となる。
【００９７】
このための回路が、図５における４つのラッチレジスタＯＦ１Ｒ１０１、ＯＦ２Ｒ１０２、ＵＦ１Ｒ１０６、ＵＦ２Ｒ１０７と、２つのセレクタ１０３及び１０８である。
【００９８】
ここで、直列に接続されているＯＦ１Ｒ１０１及びＯＦ２Ｒ１０２の２つのラッチレジスタがＯＦＨ及びＯＦＬと、浮動小数点加算器１１３による演算でのオーバーフローを示すデータであるＯＦＳとのラッチを行ない、直列に接続されているＵＦ１Ｒ１０６及びＵＦ２Ｒ１０７の２つのラッチレジスタがＵＦＨ及びＵＦＬと、浮動小数点加算器１１３による演算でのアンダーフローを示すデータであるＵＦＳとのラッチを行なう。
【００９９】
また、ＯＦ２Ｒ１０２によるラッチの前後のオーバーフロー情報の選択を行なうセレクタ１０３、及びＵＦ２Ｒ１０７によるラッチの前後のアンダーフロー情報の選択を行なうセレクタ１０８はレジスタ制御回路１０５によって制御される。
【０１００】
ところで、Ｌの仮数部は正規化が施されておらず、また暗黙の１についての処置も施されていないので、Ｌの値は、ＩＥＥＥ規格の表現形式から外れている、全体で６５ビットのデータとなっている。そのため、このＬの値を格納することになるＲＲ１１１は、既存のＩＥＥＥ倍精度浮動小数点数の演算に対応している演算装置が有している結果格納レジスタは６４ビットのビット幅であるものが一般的であるのに対し、６５ビットのビット幅を有するように構成する。
【０１０１】
但し、ＲＲ１１１のビット幅を６５ビットとする代わりに、図７に示すように仮数部正規化回路２１４と指数部減算器２１５とからなる下位データ正規化部２１６を浮動小数点乗算器１１２に設け、Ｌの仮数値の正規化とそれに伴うＬの指数値の変更を行なってから暗黙の１を除いた値を乗算結果におけるＬの仮数値として浮動小数点乗算器１１２から出力するようにすれば、ＲＲ１１１のビット幅を既存の演算装置と同様の６４ビット幅に留めることもできる。なお、このときのＯＦＬ及びＵＦＬのデータとしては、加算器２０３と指数部減算器４０２とで生じたオーバーフロー若しくはアンダーフローの論理和をそれぞれ出力する。
【０１０２】
浮動小数点乗算器１１２から出力されるＨ及びＬをＲＲ１１１に格納する順番は、Ｈを先、Ｌを後とする。これは、この演算装置においてＡ×Ｂ＋Ｃの積和演算を実行するときにおけるＡ×ＢとＣとについての２回に分けて行なわれる加算の順序の決定、すなわちＬとＣとの加算を先とするか、あるいはＨとＣとの加算を先とするかの決定は、前述したようにＨとＣとの比較結果に基づいて行なわれるため、Ｈを先にＲＲ１１１へ転送した方がこのＨとＣとの比較を早く開始することができるからである。
【０１０３】
判定回路１１５には、図８に示されている、上述したＨとＣとの比較結果に基づいて加算順序を決定するための回路が設けられている。
図８において、ＳＨ及びＳＣはそれぞれＨ及びＣの符号ビットであり、Ｅｘ−ＯＲ３０１によってこれらの符号ビットの一致・不一致が判定される。
【０１０４】
ＥＨ及びＥＣはそれぞれＨ及びＣの指数値であり、Ｅｘ−ＯＲ３０２及びＮＯＲ３０３によってＨとＣとの指数部の全ビットの一致・不一致が判定される。なお、図８におけるＮＯＲ３０３の入力部分は、Ｅｘ−ＯＲ３０２をＨ及びＣの指数部の各ビットにひとつずつ設け、全ビットをビット毎に比較することを簡略化して表現したものである。
【０１０５】
加算器３０４及び加算器３０７はＥＨ及びＥＣに「１」を加算する回路である。つまり、加算器３０４、Ｅｘ−ＯＲ３０５、及びＮＯＲ３０６によって、Ｃの指数値に「１」を加算した値とＨの指数値との全ビットの一致・不一致が判定され、加算器３０７、Ｅｘ−ＯＲ３０８、及びＮＯＲ３０９によって、Ｈの指数値に「１」を加算した値とＣの指数値との全ビットの一致・不一致が判定される。
【０１０６】
また、Ｆ０Ｈ及びＦ０Ｃは、それぞれＨ及びＣの仮数部の最上位ビットである。従って、ＮＯＲ３０３、ＮＯＲ３０６、及びＮＯＲ３０９の出力がそれぞれ入力されるＯＲ３１０の出力は、ＨとＣの符号が異なる場合であってＨの指数値とＣの指数値との差が１であり且つ両者のうち指数値が大きい方の仮数部の最上位ビットが０である場合であるか否かの判定結果を示すものとなる。
【０１０７】
以上のことから、Ｅｘ−ＯＲ３０１の出力とＯＲ３１０の出力とが入力されるＡＮＤ３１１の出力は、Ａ×ＢとＣとについての２回に分けて行なわれる加算の順序を決定するための信号となっていることが分かる。
【０１０８】
なお、判定回路１１５に上述した判定を行なわせるためには、Ｈ及びＣの値がＯＰ１Ｒ１０９、ＯＰ２Ｒ１１０、又はＲＲ１１１のいずれかに格納されている必要がある。
【０１０９】
図５の説明に戻る。
浮動小数点乗算器１１２から出力されるＨがＲＲ１１１に格納されるのと同じタイミングでＯＦＨ及びＵＦＨをそれぞれＯＦ１Ｒ１０１及びＵＦ１Ｒ１０６に格納する。
【０１１０】
次のタイミングでは、浮動小数点乗算器１１２から出力されるＬをＲＲ１１１に格納すると共に、ＯＦＬ及びＵＦＬをそれぞれＯＦ１Ｒ１０１及びＵＦ１Ｒ１０６に格納する。このとき、それまでＲＲ１１１に格納されていたＨはＯＰ２Ｒ１１０に移動させるようにする。また、それまでＯＦ１Ｒ１０１及びＵＦ１Ｒ１０６に格納されていたデータはそれぞれＯＦ１Ｒ１０２及びＵＦ１Ｒ１０７に移される。更に、このタイミングでＨの値とＣの値とに基づく判定を判定回路１１５に行なわせる。このために、予めＣの値をＯＰ１Ｒ１０９に格納しておくようにする。なお、Ｈの値をＯＰ１Ｒ１０９に格納するようにし、Ｃの値をＯＰ２Ｒ１１０に格納するようにしてもよい。
【０１１１】
次のタイミングでは、判定回路１１５による判定結果に応じた順序での加算演算が行なわれる。
判定回路１１５による判定結果がＨとＣとの加算を先に行なうべきであると判定した場合には、このタイミングでＯＰ１Ｒ１０９に格納されている数値データとＯＰ２Ｒ１１０に格納されている数値データ、すなわちＣとＨとが浮動小数点加算器１１３へと転送され、加算演算が行なわれる。なお、このときにセレクタ１０３及びセレクタ１０８が制御され、ＯＦ２Ｒ１０２に格納されているＯＦＨデータ及びＵＦ２Ｒ１０７に格納されているＵＦＨデータも浮動小数点加算器１１３へと転送される。これに伴い、ＯＦ１Ｒ１０１に格納されているＯＦＬデータがＯＦ２Ｒ１０２に移され、ＵＦ１Ｒ１０６に格納されているＵＦＬデータがＵＦ２Ｒ１０７に移される。更にこのタイミングでＲＲ１１１に格納されているＬをＯＰ２Ｒ１１０へ転送する。
【０１１２】
なお、ＬがＯＰ２Ｒ１１０に格納されるので、浮動小数点演算器１１２が図６のように構成されているのであれば、ＯＰ２Ｒ１１０は６５ビットのビット幅を有するように構成しておく必要があるが、浮動小数点演算器１１２が図７のように構成されているのであれば、ＯＰ２Ｒ１１０は６４ビットのビット幅を有するように構成すればよい。なお、このＯＰ２Ｒ１１０の構成に対する要求については、判定回路１１５の判定結果とは無関係である。
【０１１３】
一方、判定回路１１５による判定結果がＬとＣとの加算を先に行なうべきであると判定した場合には、ＲＲ１１１に格納されているＬをＯＰ２Ｒ１１０に転送し、この次のタイミングでＯＰ１Ｒ１０９に格納されている数値データとＯＰ２Ｒ１１０に格納されている数値データ、すなわちＣとＬとを浮動小数点加算器１１３へと転送して加算演算を行なわせる。
【０１１４】
なお、このとき、ＯＰ２Ｒ１１０に格納されていたＨの値は失われてしまうので、前のタイミングでＲＲ１１１からＯＰ２Ｒ１１０にＨを転送したときに、併せてこのＨの値をＴＭＰＲ（テンポラリレジスタ）１０４にも格納しておくようにする。
【０１１５】
また、ＣとＬとが浮動小数点加算器１１３へと転送されるタイミングにおいてセレクタ１０３及びセレクタ１０８が制御され、ＯＦ１Ｒ１０１に格納されているＯＦＬデータ及びＵＦ１Ｒ１０６に格納されているＵＦＬデータも浮動小数点加算器１１３へと転送される。なお、この場合には、ＯＦ２Ｒ１０２に格納されているＯＦＨデータ、及びＵＦ２Ｒ１０７に格納されているＵＦＨデータはそのまま保持される。
【０１１６】
ここで図９について説明する。同図は図５における浮動小数点加算器１１３の詳細構成を示している。
指数部変換回路４０１及び４０２は、ＯＰ１Ｒ１０９及びＯＰ２Ｒ１１０から浮動小数点加算器１１３へと転送されてくる数値データにおける１１ビットの指数値のデータを、これらのデータを得るために行なわれた演算によって生じたオーバーフロー若しくはアンダーフローについての情報を利用して１２ビットのデータへと変換するものである。
【０１１７】
指数部変換回路４０１及び４０２の詳細構成は図１０に示されている。同図において、ＥＸＰはこの回路に入力される１１ビットの指数値であり、ＯＦはオーバーフローの発生を示すフラグ、ＵＦはアンダーフローの発生を示すフラグである。そして、加算器５０７による加算結果である１２ビットの数値がこの回路の出力となる。
【０１１８】
図１０において、ＯＦ及びＵＦが共に「０」である場合、すなわちＥＸＰの値を求める演算においてオーバーフローもアンダーフローも生じていなかった場合には、ＯＦ及びＵＦの論理値をそれぞれ反転するＮＯＴ５０１及びＮＯＴ５０２の作用により、数値「１０２４」がＡＮＤ５０３及びＯＲ５０６を経て加算器５０７に入力され、ＥＸＰの値に加算される。ここで、「１０２４」とは、ＥＸＰの値である１１ビットの指数値に与えられているバイアス値Ｂ１が１０２３であり、変換後の１２ビットの指数値に与えられるバイアス値Ｂ２を２０４７としたときの（−Ｂ１＋Ｂ２）の値である。つまり、この場合には、図１０に示す回路は前述した指数値変換式におけるオーバーフロー・アンダーフローが共に生じていない場合の変換式の計算を実行するものとなる。
【０１１９】
また、図１０において、ＯＦが「１」でＵＦが「０」の場合、すなわちＥＸＰの値を求める演算においてオーバーフローが生じていた場合には、数値「２０５６」がＡＮＤ５０４及びＯＲ５０６を経て加算器５０７に入力され、ＥＸＰの値に加算される。ここで、「２０５６」とは、前述した場合と同様に、Ｂ１が１０２３であって、Ｂ２を２０４７とし、更に、この演算装置における指数部演算部２０１及び加算器２０３（更に浮動小数点乗算器１１２が図７の構成を有している場合には指数部減算器２１５）において指数補正のために使用されていた定数βから求まる値α（β＝２のα乗）がいずれも「１５３６」であるとしたときの（−Ｂ１＋Ｂ２＋α）の値である。つまり、この場合には、図１０に示す回路は前述した指数値変換式におけるオーバーフローが生じた場合の変換式の計算を実行するものとなる。
【０１２０】
更に、図１０において、ＯＦが「０」でＵＦが「１」の場合、すなわちＥＸＰの値を求める演算においてアンダーフローが生じていた場合には、数値「−５１２」がＡＮＤ５０５及びＯＲ５０６を経て加算器５０７に入力され、ＥＸＰの値に加算される。ここで、「−５１２」とは、前述した場合と同様に、Ｂ１が１０２３であって、Ｂ２を２０４７とし、更に、αが「１５３６」であるとしたときの（−Ｂ１＋Ｂ２−α）の値である。つまり、この場合には、図１０に示す回路は前述した指数値変換式におけるアンダーフローが生じた場合の変換式の計算を実行するものとなる。
【０１２１】
以上のように、図１０に示されている回路は、前述した指数値変換式に従って１１ビットの指数値のデータを１２ビットのデータへと変換する。
図９の説明へ戻る。指数部比較部４０３は、２つの指数部変換部４０１及び４０２から出力される指数値データを比較してそのどちらが大きいかの判定を行なうと共に、その両者の差を算出する。この指数部比較部４０３は、図１５に示した従来の積和演算器における減算回路１００３に相当する機能を実行するものである。
【０１２２】
仮数部選択回路４０４は、指数部比較部４０３から出力されるセレクト信号、すなわち２つの指数部変換部４０１及び４０２から出力される変換された指数値データのうちでそのどちらの値が大きいかを示す信号に基づき、ＯＰ１Ｒ１０９及びＯＰ２Ｒ１１０から浮動小数点加算器１１３へと転送されてくる数値データのうちその変換後の指数値の大きい方についての仮数値を絶対値加算回路４０６の一方の入力へと出力し、小さい方についての仮数値をアライン回路４０５へ出力する。この仮数部選択回路４０４は図１５に示した従来の積和演算器における仮数部選択回路１００４に相当する機能を実行するものであるが、その入出力を、ＯＰ１Ｒ１０９側の入力については５２ビットのビット幅、ＯＰ１Ｒ側の入力及び２つの出力については５３ビットのビット幅を有するように構成することができ、回路規模の増大が抑制される。更に、浮動小数点演算器１１２が図７のように構成されているのであれば、全ての入出力で５２ビットのビット幅を有するように構成することができる。
【０１２３】
アライン回路４０５は、指数部比較部４０３から出力されるシフト量情報、すなわち２つの指数部変換部４０１及び４０２から出力される変換された２つの指数値の差、つまりＯＰ１Ｒ１０９及びＯＰ２Ｒ１１０から浮動小数点加算器１１３へと転送されてくる数値データのうちその変換後の指数値の小さい方についての仮数値の小数点を桁揃えのために移動させるときの移動量を示す情報に基づいて、仮数部選択回路４０４から与えられた仮数値の小数点を移動させ、その移動させた後の仮数値を絶対値加算回路４０６のもう一方の入力へと出力する。このアライン回路４０５は図１５におけるアライン回路１００５に相当する機能を実行するものであるが、その入出力を共に５３ビット（浮動小数点演算器１１２が図７のように構成されているのであれば５２ビット）のビット幅として構成することができる。
【０１２４】
絶対値加算回路４０６は、仮数部選択回路４０４及びアライン回路４０５から与えられた、桁揃えがなされているＯＰ１Ｒ１０９及びＯＰ２Ｒ１１０から浮動小数点加算器１１３へと転送されてくる数値データのうちの仮数値についての５３ビットのビット幅での加算を行なう。なお、浮動小数点演算器１１２が図７のように構成されているのであればここで暗黙の１を付加した５３ビットのビット幅での加算を行なう。この絶対値加算回路４０６は図１５における絶対値加算回路１００６に相当する機能を実行するものであるが、ここでも回路規模の増大が抑制されている。
【０１２５】
先行０カウンタ４０７は、絶対値加算回路４０６による演算結果である仮数値を表現しているビット列における最上位から並ぶ「０」の数を計数する。
正規化処理部４０８では、絶対値加算回路４０６による演算結果である仮数値が正規化数の存在範囲内に収まるようにするために、その仮数値を表現しているビット列を、シフト量情報で示される数、すなわち先行０カウンタ４０７による計数値に相当するビット数だけ左シフトする。
【０１２６】
この先行０カウンタ４０７及び正規化処理部４０８は、図１５においても正規化回路１００６が本来備えることとなるものであるが、絶対値加算回路４０６の出力が５３ビットのビット幅なので、ここでも図１５の積和演算器に比べて回路規模が小さくなる。
【０１２７】
セレクタ４０９は、指数部比較部４０３から出力されるセレクト信号に基づき、ＯＰ１Ｒ１０９及びＯＰ２Ｒ１１０から浮動小数点加算器１１３へと転送されてくる数値データのうち指数部変換部４０１及び４０４によって変換された後の指数値の大きい方、すなわち、絶対値加算回路４０６で行なわれる仮数値同士の加算における基準である指数値を選択するものであり、図１５におけるセレクタ１００９に相当するものである。
【０１２８】
減算器４１０は、セレクタ１００９で選択された指数値から正規化回路１００７から送られてくるシフト量情報で示される値の減算を行ない、正規化処理部４０８で行なわれる左ビットシフトによって生じる仮数値の増加の補償を指数値に対して施す。
【０１２９】
指数部補正回路４１１は、減算器４１０の出力までは１２ビットで表現されている指数値から、ＩＥＥＥの倍精度浮動小数点数についての規格に準拠する１１ビットの指数値への補正を行なう回路である。
【０１３０】
指数部補正回路４１１の詳細構成は図１１に示されている。同図において、ＥＸＰはこの回路に入力される１２ビットの指数値である。
まず、加算器６０１によって入力された指数値と「−１０２４」との加算が実行される。そして、この加算の結果の値を１１ビットのビット幅で表現するとき、オーバーフローが生じてしまうときにはオーバーフローの発生を示すフラグＯＦがセットされて出力され、また、アンダーフローが生じてしまうときにはアンダーフローの発生を示すフラグＵＦがセットされて出力される。従って、ＯＦ及びＵＦの論理値をそれぞれ反転するＮＯＴ６０２及びＮＯＴ６０３の作用により、加算器６０１でＯＦ及びＵＦが共にセットされなかったとき、すなわち加算器６０１による加算の結果の値を１１ビットのビット幅で表現してもオーバーフローもアンダーフローも生じなかったときには、加算器６０１による加算結果はＡＮＤ６０６及びＯＲ６０９を経てこの回路から１１ビットの指数値として出力される。ここで、「−１０２４」という数値は、ＥＸＰの値である１２ビットの指数値に与えられているバイアス値Ｂ１が２０４７であり、指数補正後の１１ビットの指数値に与えられるバイアス値Ｂ２が１０２３であるときの（−Ｂ１＋Ｂ２）の値であり、ＥＸＰの値にこの（−Ｂ１＋Ｂ２）の値を加算することで１２ビットから１１ビットの指数補正が行なえることは前述した説明より明らかである。
【０１３１】
一方、加算器６０１でＯＦがセットされたとき、すなわち加算器６０１による加算の結果の値を１１ビットのビット幅で表現するとオーバーフローが生じたときには、加算器６０１による加算結果に更に「−１５３６」が加算器６０４によって加算され、その加算結果がＡＮＤ６０７及びＯＲ６０９を経てこの回路から１１ビットの指数値として出力される。ここで、「１５３６」という数値は、前述した図１０の説明で用いたαの値である。つまり、ＥＸＰの値に前述した（−Ｂ１＋Ｂ２）の値を加算した結果を１１ビットのビット幅で表現するとオーバーフローが生じるときは、この回路はその値からαの値を減じた結果を１１ビットの指数値として出力すると共に、オーバーフローの発生を示すフラグＯＦを併せて出力するようにしているのである。
【０１３２】
また、加算器６０１でＵＦがセットされたとき、すなわち加算器６０１による加算の結果の値を１１ビットのビット幅で表現するとアンダーフローが生じたときには、加算器６０１による加算結果に更に「＋１５３６」が加算器６０５によって加算され、その加算結果がＡＮＤ６０８及びＯＲ６０９を経てこの回路から１１ビットの指数値として出力される。つまり、ＥＸＰの値に前述した（−Ｂ１＋Ｂ２）の値を加算した結果を１１ビットのビット幅で表現するとアンダーフローが生じるときは、この回路はその値からαの値を加えた結果を１１ビットの指数値として出力すると共に、アンダーフローの発生を示すフラグＵＦを併せて出力するようにしているのである。
【０１３３】
なお、この減算器４１０及び指数部補正回路４１１は、図１５においても指数部補正部１０１０が本来備えることとなるものである。
図９の説明へ戻る。ＧＲＫ演算回路４１２は、正規化処理部４０８から出力される仮数値の加算結果に対して丸め回路４１３が施す丸めの処理の内容を決定する基となる前述したＧＲＫの各ビットを得るための回路である。
【０１３４】
丸め回路４１３は、正規化処理部４０８から出力された仮数値に対し、ＧＲＫ演算回路４１２から送られてくるＧＲＫの各ビットに基づいて丸めの処理を施す。
【０１３５】
ＧＲＫ演算回路４１２の詳細構成は図１２に示されている。同図において、Ｇ’Ｒ’Ｋ’はアライン回路４０５において桁そろえのために行なわれた右ビットシフトにより生じたＧＲＫの各ビットである。また、指数部比較部４０３からはセレクト信号がこの回路に入力される。このセレクト信号は仮数部選択回路４０４によるデータ選択を制御する信号でもあるから、この信号より、アライン回路４０５へ入力された数値データが、ＯＰ１Ｒ１０９及びＯＰ２Ｒ１１０から浮動小数点加算器１１３へと各々転送されてくる数値データのうちのどちらの仮数値であるかを知ることができる。
【０１３６】
ラッチレジスタ７０１、７０２、及び７０３は、浮動小数点加算器１１３が前回に加算演算を実行したときにアライン回路４０５から出力されたＧＲＫの各ビットの値を一時的に保持する。なお、ラッチレジスタ７０１、７０２、及び７０３は、Ａ×Ｂ＋Ｃの積和演算で実行される２回の加算における先の加算演算の開始時にリセットされる。従って、この２回の加算における後の加算演算が実行されるときには、先の加算演算においてアライン回路４０５から出力されたＧＲＫの各ビットの値が保持されている。
【０１３７】
ラッチレジスタ７０１、７０２、及び７０３がこのような動作をするので、この２回の加算における先の加算演算が実行されたときのＧＲＫの各ビットの値をＧ、Ｒ、Ｋとし、後の加算演算が実行されたときのＧＲＫの各ビットの値をＧ’Ｒ’Ｋ’とすると、ＯＲ７０４、７０５、及び７０６の出力は、それぞれＧ’∪Ｇ、Ｒ’∪Ｒ、Ｋ’∪Ｋとなる。
【０１３８】
従って、Ｌ＋Ｃを先に加算して行なう２回の加算における後の加算演算において、Ｌ＋Ｃの演算結果の指数値がＨの指数値よりも大きいためアライン回路４０５がＨの仮数値に対して桁揃えを行なった場合にこのＯＲ７０４、７０５、及び７０６の出力がＧＲＫ演算回路４１２から出力されるようにすれば、前述したように、この出力を丸め回路４１３での丸めの処理の基とすることができる。
【０１３９】
ここで、Ｈの仮数値はＯＰ２Ｒ１１０から転送されてくる数値データの一部である。従って、指数部比較部４０３から出力されるセレクト信号が、ＯＰ２Ｒ１１０から転送されてくる数値データの仮数部をアライン回路４０５に入力させるように仮数部選択回路４０４を切り換える信号であるときには、ＯＲ７０４、７０５、及び７０６の出力がＧＲＫ演算回路４１２から出力されるようにセレクタ７０８を構成する。
【０１４０】
一方、Ｌ＋Ｃを先に加算して行なう２回の加算における後の加算演算においてＨの指数値がＬ＋Ｃの演算結果の指数値よりも大きいときには、アライン回路４０５はＬ＋Ｃの演算結果の仮数値に対して桁揃えを行なったものについてのＧＲＫの各ビットを出力する。従って、丸め回路４１３での丸めの処理の基とするＧＲＫの各ビットとしては、Ｇ及びＲの両ビットについてはこのアライン回路４０５の出力をそのまま使用し、Ｋビットについては、このアライン回路４０５の出力のＫビットと先に行なわれたＬ＋Ｃの加算演算において廃棄された全ての下位ビットとの論理和、すなわちアライン回路４０５の出力のＫビットとラッチレジスタ７０１、７０２、及び７０３に保持されている先の加算演算時のＧＲＫの各ビットとの論理和を使用すればよい。
【０１４１】
つまり、指数部比較部４０３から出力されるセレクト信号がＯＰ１Ｒ１０９から転送されてくる数値データの仮数部、すなわちＬ＋Ｃの演算結果の仮数値をアライン回路４０５に入力させるように仮数部選択回路４０４を切り換える信号であるときには、アライン回路４０５から送られてくるビットのうち、Ｇ及びＲの両ビットについてはこのまま出力され、Ｋビットについてはこれとラッチレジスタ７０１、７０２、及び７０３に保持されている先の加算演算時のＧＲＫの各ビットとをＯＲ７０７に入力したときのＯＲ７０７の出力がＧＲＫ演算回路４１２から出力されるようにセレクタ７０８を構成する。
【０１４２】
なお、Ｈ＋Ｃを先に加算して行なう２回の加算の場合には、前述したように先に行なわれるＨ＋Ｃの加算ではＧＲＫは発生しないため、ラッチレジスタ７０１、７０２、及び７０３にはＧＲＫの各ビットが入力されない。この場合では、図１２に示すＧＲＫ演算回路４１２から出力されるＧＲＫの各ビットの値は、例えセレクタ７０８がどちらに切り替わったとしてもこの回路に入力されたＧＲＫの各ビットの値がそのまま出力されることは明らかである。
【０１４３】
丸め回路４１３ではＧＲＫ演算回路４１２においてこのようにして得られたＧＲＫの各ビットの値に基づいて正規化処理部４０８から出力された仮数値に対して丸めの処理を施す。
【０１４４】
カウンタ４１４は、この浮動小数点加算器１１３で実行される加算の回数を計数し、今回行なわれた加算演算がＡ×Ｂ＋Ｃの積和演算で実行される２回の加算のうちの先の加算であるか後の加算であるかを判別する。
【０１４５】
セレクタ４１５、４１６、及び４１７は、カウンタ４１４での判別結果に基づき、今回行なわれた加算演算がＡ×Ｂ＋Ｃの積和演算で実行される２回の加算のうちの先の加算であれば、指数部補正回路４１１からの１１ビットの出力を指数値とし、正規化処理部４０８の出力から暗黙の１を取り除いた５２ビットの値を仮数値とする加算演算の結果を出力し、併せて指数部補正回路４１１から出力されるＯＦ及びＵＦの両フラグをそれぞれＯＦＳ及びＵＦＳとして出力する。一方、今回行なわれた加算演算がＡ×Ｂ＋Ｃの積和演算で実行される２回の加算のうちの後の加算であれば、セレクタ４１５、４１６、及び４１７は、指数部補正回路４１１からの出力に対して必要に応じて丸め回路１１によって変更が加えられた１１ビットの値を指数値とし、丸め回路４１３から出力される丸め処理を施された仮数値から暗黙の１を取り除いた５２ビットの値を仮数値とする加算演算の結果を出力し、併せて丸め回路４１３から出力される、指数部補正回路４１１又は丸め回路４１３のいずれか若しくは両方から出力されるＯＦ及びＵＦの両フラグをそれぞれＯＦＳ及びＵＦＳとして出力する。
【０１４６】
図５に示す演算装置は以上のようにして、倍精度浮動小数点数Ａ、Ｂ、Ｃについての積和演算Ａ×Ｂ＋Ｃを行なう。
なお、これまでに説明したこの演算装置における乗算・加算の実行やレジスタ間でのデータの授受は、図５に示す演算装置の各部の動作制御を司る動作制御部１１６によって管理される。この動作制御部１１６は、ワイヤードロジックで構成してハードウェアでこれらの管理を実現させるようにするか、あるいは中央処理ユニットを備えてそこでマイクロコード命令やファームウェアを実行させてソフトウェアでこれらの管理を実現させるようにする。なお、動作制御部１１６を設ける代わりに、この動作管理を図５の演算装置の外部から行なうようにすることも可能である。
【０１４７】
ソフトウェアによる動作管理を行なうときに用いられる擬似命令コードを用いて記述した制御プログラムの一例を図１３に示す。
図１３に示す制御プログラムは、積和演算Ａ×Ｂ＋ＣにおけるＡの値がＯＰ１Ｒ１０９に、Ｂの値がＯＰ２Ｒ１１０にそれぞれ格納されている状態で開始される。
【０１４８】
同図において、（１）は、ＯＰ１Ｒ１０９とＯＰ２Ｒ１１０とに格納されているそれぞれの値についてその仮数部を正確に算出する乗算、すなわち、演算結果の下位部分を丸めずに算出する乗算を浮動小数点乗算器１１２に行なわせることを示している。
【０１４９】
（２）は、（１）の乗算結果が格納される乗算結果レジスタ１１４におけるＨ（上位）部分をＲＲ１１１へ転送すると共に、Ｃの値をＯＰ１Ｒ１０９に格納することを示している。
【０１５０】
（３）は、ＲＲ１１１に格納されている値、すなわち（１）の乗算結果におけるＨの値をＯＰ２Ｒ１１０とＴＭＰＲ１０４とへ同時に転送することを示している。
【０１５１】
（４）は、ＯＰ１Ｒ１０９とＯＰ２Ｒ１１０とに格納されているそれぞれの値、すなわちＣの値とＨの値との比較を判定回路１１５に行なわせると共に、（１）の乗算結果が格納される乗算結果レジスタ１１４におけるＬ（下位）部分をＲＲ１１１に転送することを示している。
【０１５２】
（５）は、（４）で判定回路１１５に行なわせた判定結果に基づき、Ｃ＋Ｌを先に行なうべきであると判定されたときには処理を（６）に分岐させ、Ｃ＋Ｈを先に行なうべきであると判定されたときには処理を（１０）に分岐させることを示している。
【０１５３】
（６）は、ＲＲ１１１に格納されている値、すなわち、（１）の乗算結果におけるＬの値をＯＰ２Ｒ１１０へ転送することを示している。
（７）は、ＯＰ１Ｒ１０９とＯＰ２Ｒ１１０とに格納されているそれぞれの値、すなわちＣの値とＬの値との加算を浮動小数点加算器１１３に行なわせることを示している。なお、浮動小数点加算器１１３での加算の結果は自動的にＲＲ１１１へ転送されて格納される。
【０１５４】
（８）は、ＲＲ１１１に格納されている値、すなわちＣの値とＬの値との加算結果をＯＰ１Ｒ１０９に転送すると共に、ＴＭＰＲ１０４に格納されている値、すなわちＨの値をＯＰ２Ｒ１１０に転送することを示している。
【０１５５】
（９）は、ＯＰ１Ｒ１０９とＯＰ２Ｒ１１０とに格納されているそれぞれの値、すなわちＣ＋Ｌの加算結果とＨの値との加算を浮動小数点加算器１１３に行なわせることを示している。この後にＲＲ１１１に格納される値がＡ×Ｂ＋Ｃの積和演算の結果の値である。
【０１５６】
（１０）は、ＯＰ１Ｒ１０９とＯＰ２Ｒ１１０とに格納されているそれぞれの値、すなわちＣの値とＨの値との加算を浮動小数点加算器１１３に行なわせると共に、ＲＲ１１１に格納されている値、すなわち（４）でＲＲへ転送されていたＬの値をＯＰ２Ｒ１１０へ転送することを示している。
【０１５７】
（１１）は、ＲＲ１１１に格納されている値、すなわち（１０）の加算結果であるＣ＋Ｈの値をＯＰ１Ｒ１０９へ転送することを示している。
（１２）は、ＯＰ１Ｒ１０９とＯＰ２Ｒ１１０とに格納されているそれぞれの値、すなわちＣ＋Ｈの加算結果とＬの値との加算を浮動小数点加算器１１３に行なわせることを示している。この後にＲＲ１１１に格納される値がＡ×Ｂ＋Ｃの積和演算の結果の値である。
【０１５８】
図１３に示す制御プログラムは上述した命令内容を示しており、図５に示す演算装置がこの制御プログラムに記述されている命令に従って動作することによって、精度の維持されたＡ×Ｂ＋Ｃの積和演算が行なわれる。
【０１５９】
（付記１）浮動小数点数をビット列で表現する浮動小数点数データの乗算及び加算を行なうことで積和演算を実行する積和演算装置であって、
前記浮動小数点数データの乗算を行なう乗算手段と、
前記浮動小数点数データの加算を行なう加算手段と、
前記加算手段で行なわれた加算の結果として得られる浮動小数点数データに丸めの処理を施す丸め手段と、
前記浮動小数点数データである第一のデータと第二のデータとの積へ該浮動小数点数データである第三のデータを加算する積和演算の結果が格納される結果格納手段と、
前記第一のデータと前記第二のデータとの乗算の結果である乗算結果データを前記乗算手段に算出させる乗算制御手段と、
前記乗算結果データにおける仮数部を表現するビット列を該仮数部における上位の桁を表現するものと該仮数部における下位の桁を表現するものとの２つに分割したうちの該下位の桁を表現するビット列を仮数部とする下位乗算結果データに、前記第三のデータを加算して得られる第一加算結果データを前記加算手段に算出させる第一加算制御手段と、
前記第一加算結果データに前記上位の桁を表現するビット列を仮数部とする上位乗算結果データを加算して得られる第二加算結果データを前記加算手段に算出させる第二加算制御手段と、
を有し、
前記結果格納手段には、前記第二加算結果データに対する丸めの処理が前記丸め手段によって施されて得られる浮動小数点データである第一の積和演算結果データが格納される、
ことを特徴とする積和演算装置。
（付記２）前記浮動小数点数データの表現形式は、ＩＥＥＥ（The Institute of Electrical and Electronics Engineers, Inc. ）の２進浮動小数点算術演算についての規格であるＩＥＥＥ−７５４規格に準拠していることを特徴とする付記１に記載の積和演算装置。
（付記３）前記上位乗算結果データに前記第三のデータを加算して得られる第三加算結果データを前記加算手段に算出させる第三加算制御手段と、
前記第三加算結果データに前記下位乗算結果データを加算して得られる第四加算結果データを前記加算手段に算出させる第四加算制御手段と、
前記上位乗算結果データと前記第三のデータとの比較を行なう比較手段と、
を更に有し、
前記結果格納手段には、前記比較手段による前記比較の結果に基づき、前記第一の積和演算結果データの代わりに、前記第四加算結果データに対する丸めの処理が前記丸め手段によって施されて得られる浮動小数点データである第二の積和演算結果データが格納される、
ことを特徴とする付記１に記載の積和演算装置。
（付記４）前記比較手段による比較の結果が前記上位乗算結果データと前記第三のデータとの符号が一致していることを示しているときには、前記結果格納手段には前記第一の積和演算結果データが格納されることを特徴とする付記３に記載の積和演算装置。
（付記５）前記比較手段による比較の結果が前記上位乗算結果データと前記第三のデータとの符号が異なっていることを示しているときには、該比較の結果が、該上位乗算結果データで表現されている指数部の値と該第三のデータとの指数部の値とが一致していることを示している場合に前記第二の積和演算結果データが格納されることを特徴とする付記３に記載の積和演算装置。
（付記６）前記比較手段による比較の結果が前記上位乗算結果データと前記第三のデータとの符号が異なっていることを示しているときには、該上位乗算結果データで表現されている指数部の値と該第三のデータとの指数部の値との差が１であって且つ該乗算結果データと該第三のデータとでそれぞれ表現されている指数部の値のうち大きい方のものについての仮数部を表現しているビット列のうちの最上位のビットが０である場合には前記第二の積和演算結果データが格納されることを特徴とする付記３に記載の積和演算装置。
（付記７）前記比較手段による比較の結果が前記上位乗算結果データと前記第三のデータとの符号が異なっていることを示しているときには、該比較の結果が、該上位乗算結果データで表現されている指数部の値と該第三のデータとの指数部の値とが一致していることを示している場合、若しくは、該上位乗算結果データで表現されている指数部の値と該第三のデータとの指数部の値との差が１であって且つ該乗算結果データと該第三のデータとでそれぞれ表現されている指数部の値のうち大きい方のものについての仮数部を表現しているビット列のうちの最上位のビットが０である場合には前記第二の積和演算結果データが格納され、その他の場合には前記第一の積和演算結果データが格納されることを特徴とする付記３に記載の積和演算装置。
（付記８）前記乗算手段による乗算の結果若しくは前記加算手段による加算の結果を示す浮動小数点数データにおいて指数部の表現のために割り当てられているビット数を、該乗算若しくは該加算においてオーバーフロー又はアンダーフローが生じたことを示す情報に基づいて拡張する変換を行なう指数部変換手段を更に有し、
前記加算手段で行なわれる加算の対象が前記乗算手段による乗算の結果若しくは該加算手段自身が以前に行なった加算の結果を示すデータであるとき、該加算手段は、前記指数部変換手段による変換が行なわれた後の値が該データにおける指数部の値であるものとして該データの加算を行なう、
ことを特徴とする付記１に記載の積和演算装置。
（付記９）前記加算手段は、該加算手段で行なわれた加算の結果として得られる浮動小数点数データに前記丸め手段が丸めの処理を施すための基とする情報である丸め処理情報を該加算の結果と併せて出力し、
前記丸め手段は、前記第二加算結果データに対して前記丸めの処理を施すときには、前記加算手段が前記第一加算結果データの算出を行なったときに出力された第一の丸め処理情報、及び該加算手段が該第二加算結果データの算出を行なったときに出力された第二の丸め処理情報に基づいて該丸めの処理を施す、
ことを特徴とする付記１に記載の積和演算装置。
（付記１０）前記丸め処理情報は、前記加算手段による加算の対象とする２つの浮動小数点数データのうちのいずれかの仮数部の値に対し、仮数部の値の加算のために施される桁揃えによって切り捨てられたビット列のうちの最上位のビットであるガードビット、該最上位のビットの下の桁である第二位のビットであるラウンドビット、及び該第二位のビットの下の桁以降の全てのビットの論理和を示すビットであるスティッキービットとを有し、
前記丸め手段は、前記第二加算結果データに対して前記丸めの処理を施すときには、前記第一の丸め情報におけるガードビットと前記第二の丸め情報におけるガードビットとの論理和、該第一の丸め情報におけるラウンドビットと該第二の丸め情報におけるラウンドビットとの論理和、及び該第一の丸め情報におけるガードビットとラウンドビットとスティッキービットと該第二の丸め情報におけるスティッキービットとの論理和、に基づいて該丸めの処理を施す、
ことを特徴とする付記９に記載の積和演算装置。
（付記１１）浮動小数点数をビット列で表現する浮動小数点数データである第一のデータと第二のデータとの積へ該浮動小数点数データである第三のデータを加算する積和演算を実行する積和演算方法であって、
浮動小数点数データの乗算を行なう乗算器に前記第一のデータと前記第二のデータとの乗算を行なわせ、
前記乗算の結果である乗算結果データにおける仮数部を表現するビット列を該仮数部における上位の桁を表現するものと該仮数部における下位の桁を表現するものとの２つに分割したうちの該下位の桁を表現するビット列を仮数部とする下位乗算結果データに前記第三のデータを加算する演算を浮動小数点数データの加算を行なう加算器に行なわせ、
前記加算の結果である第一加算結果データに前記上位の桁を表現するビット列を仮数部とする上位乗算結果データを加算して得られる第二加算結果データを前記加算器に算出させ、
前記第二加算結果データに対して丸めの処理を施して得られたデータを該積和演算の結果とする、
ことを特徴とする積和演算方法。
【０１６０】
【発明の効果】
以上詳細に説明したように、本発明は、浮動小数点数をビット列で表現する浮動小数点数データである第一のデータと第二のデータとの積へ該浮動小数点数データである第三のデータを加算する積和演算を実行するために、第一のデータと第二のデータとの乗算の結果である乗算結果データにおける仮数部を表現するビット列を該仮数部における上位の桁を表現するものと該仮数部における下位の桁を表現するものとの２つに分割し、そのうちの該下位の桁を表現するビット列を仮数部とする下位乗算結果データと第三のデータとの加算を先に行ない、該加算の結果と該上位の桁を表現するビット列を仮数部とする上位乗算結果データとの加算を後に行なうようにし、その後の加算の結果に対して丸めの処理を施して得られたデータを該積和演算の結果とする。
【０１６１】
こうすることにより、乗算結果をそのままのビット幅で加算器に入力する構成を採る場合に比べて加算器の回路規模が小さくなり、乗算器から加算器へデータを転送するバスのビット幅も少なくなるので、回路規模の増大が抑制される。
【０１６２】
また、乗算結果の仮数部における上位の桁を仮数部とするデータと第三のデータとの加算を先に行なうとその加算の途中で行なわれる仮数部の桁揃えのために消失してしまう可能性のある第三のデータの下位部分が消失することなく、十分な演算精度を有することができる。
【０１６３】
以上のように、本発明によれば、浮動小数点数積和演算について十分な演算精度を有する演算装置を少ない回路規模の増加で実現することが可能となる効果を奏する。
【図面の簡単な説明】
【図１】指数値の変換を説明する図である。
【図２】乗算結果の値における仮数値の分割を説明する図である。
【図３】Ｇ、Ｒ、Ｋの各ビットを説明する図である。
【図４】Ｐの指数値がＨの指数値よりも大きい場合におけるＣ、Ｈ、Ｌの関係を示す図である。
【図５】本発明を実施する演算装置の構成を示す図である。
【図６】図５における浮動小数点乗算器の詳細構成を示す図である。
【図７】図５における浮動小数点乗算器の別の例を示す図である。
【図８】図５における判定回路に設けられている回路の構成を示す図である。
【図９】図５における浮動小数点加算器の詳細構成を示す図である。
【図１０】図９における指数部変換回路の詳細構成を示す図である。
【図１１】図９における指数部補正回路の詳細構成を示す図である。
【図１２】図９におけるＧＲＫ演算回路の詳細構成を示す図である。
【図１３】図５に示す演算装置に積和演算を行なわせるための制御プログラムの例を示す図である。
【図１４】ＩＥＥＥ規格における浮動小数点数値の表現形式を示す図である。
【図１５】従来の積和演算器の構成例を示す図である。
【図１６】丸め処理の例を説明する図である。
【符号の説明】
１０１、１０２、１０６、１０７、７０１、７０２、７０３  ラッチレジスタ
１０３、１０８、４０９、４１５、４１６、４１７、７０８、１００９  セレクタ
１０４  テンポラリレジスタ
１０５  レジスタ制御回路
１０９  ＯＰ１レジスタ
１１０  ＯＰ２レジスタ
１１１  リザルトレジスタ
１１２  浮動小数点乗算器
１１３  浮動小数点加算器
１１４  乗算結果レジスタ
１１５  判定回路
１１６  動作制御部
２０１  指数部演算部
２０２  仮数部演算部
２０３、３０４、３０７、５０７、６０１、６０４、６０５  加算器
２０４  符号レジスタ
２０５  上位データ用オーバーフローレジスタ
２０６  上位データ用アンダーフローレジスタ
２０７  上位データ用指数値レジスタ
２０８  下位データ用オーバーフローレジスタ
２０９  下位データ用アンダーフローレジスタ
２１０  下位データ用指数値レジスタ
２１１  仮数部乗算結果レジスタ
２１２  丸め演算回路
２１３、３０１、３０２、３０５、３０８  Exclusive-ＯＲ
２１４  仮数部正規化回路
２１５  指数部減算器
２１６  下位データ正規化部
３０３、３０６、３０９  ＮＯＲ
３１０、５０６、６０９、７０４、７０５、７０６、７０７  ＯＲ
３１１、５０３、５０４、５０５、６０６、６０７、６０８  ＡＮＤ
４０１、４０２  指数部変換部
４０３  指数部比較部
４０４、１００４  仮数部選択回路
４０５、１００５  アライン回路
４０６、１００６  絶対値加算回路
４０７  先行０カウンタ
４０８  正規化処理部
４１０  減算器
４１１  指数部補正回路
４１２  ＧＲＫ演算回路
４１３、１００８  丸め回路
４１４  カウンタ
５０１、５０２、６０２、６０３  ＮＯＴ
１００１  加算回路
１００２  仮数部乗算回路
１００３  減算回路
１００７  正規化回路
１０１０  指数部補正部
【図１】
0003845009.tif 000004
【図２】
0003845009.tif 000005
【図３】
0003845009.tif 000006
【図４】
0003845009.tif 000007
【図５】
0003845009.tif 000008
【図６】
0003845009.tif 000009
【図７】
0003845009.tif 000010
【図８】
0003845009.tif 000011
【図９】
0003845009.tif 000012
【図１０】
0003845009.tif 000013
【図１１】
0003845009.tif 000014
【図１２】
0003845009.tif 000015
【図１３】
0003845009.tif 000016
【図１４】
0003845009.tif 000017
【図１５】
0003845009.tif 000018
【図１６】
0003845009.tif 000019