演算回路、演算処理装置、及び演算回路の制御方法
【課題】固定精度浮動小数点数の組を丸め対象とした場合に、丸め演算を効率的に実現する演算方式を提供する。
【解決手段】丸めを行なう演算回路は、N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と指数部とを含む丸め対象データを保持するレジスタと、丸め対象データに対する丸め処理の精度を表す丸め精度を保持するレジスタと、仮数部の最上位桁から連続するゼロ値を計数する先行ゼロ計数部と、指数部に1を増分した結果から、丸め精度と先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸めが行われる指数を表す丸め指数部を算出する指数生成部と、指数生成部が生成した丸め指数部に基づき、第1の丸め加算値と第2の丸め加算値のいずれかを選択して丸め加算値を出力する丸め加算値選択部と、丸め指数部と丸め加算値とを保持する出力レジスタを有する。
【解決手段】丸めを行なう演算回路は、N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と指数部とを含む丸め対象データを保持するレジスタと、丸め対象データに対する丸め処理の精度を表す丸め精度を保持するレジスタと、仮数部の最上位桁から連続するゼロ値を計数する先行ゼロ計数部と、指数部に1を増分した結果から、丸め精度と先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸めが行われる指数を表す丸め指数部を算出する指数生成部と、指数生成部が生成した丸め指数部に基づき、第1の丸め加算値と第2の丸め加算値のいずれかを選択して丸め加算値を出力する丸め加算値選択部と、丸め指数部と丸め加算値とを保持する出力レジスタを有する。
【発明の詳細な説明】
【技術分野】
【0001】
本願開示は、演算回路、演算処理装置、及び演算回路の制御方法に関する。
【背景技術】
【0002】
銀行等において勘定処理を行なう勘定系や、一部の科学技術計算などでは、数値表現や演算における誤差を小さくするために、多倍長、または、可変長の数値表現形式が採用されることがある。このような場合、符号と指数とをひとつの整数で表現し、仮数については、ひとつの整数で表現した符号と指数とは別の整数の列で表現することが多い。また、このような数値表現を採用した場合には、整数演算を利用して数値同士の計算が実現されることも多くあった。
【0003】
それに対し、多倍長や可変長の浮動小数点演算を、固定精度の浮動小数点演算を用いて実現する方法が提案されている。固定精度の浮動小数点演算については、ハードウエアによる処理手段を提供している場合が多いため、そのようなハードウエア処理手段を用いることで、全ての処理をソフトウェアに行なわせる場合よりも処理の高速化をはかることができる。例えば、多倍長の2進浮動小数点演算を、2倍長の浮動小数点演算を用いて行うライブラリも存在する。
【0004】
これらの方法では、固定精度浮動小数点数の組(要素同士の足し算を実行せずに組のまま用いることから「未評価の和」とも呼ばれる)によりひとつの数を表現し、その組同士の算術を適切に実行することで、大きな精度の算術(四則演算)を実現している。更に、このように大きな精度の範囲で正確な算術を実現することに加え、現実のソフトウエアでは、精度に関して、丸め演算も実行される。例えば、ある種のデータベースにおいては、数値型に関して精度指定とスケール指定との2通りの方法で丸め位置を指定できる。このようなソフトウエアの高速化のためには、演算を高速に処理するだけでなく、丸め処理も効率良く行う必要がある。
【先行技術文献】
【非特許文献】
【0005】
【非特許文献1】T. Dekker, A Floating-Point Technique for Extending the Available Precision, Numer. Math. vol. 18, pp.224-242, 1971.
【非特許文献2】D. Priest, Appendix A: Algorithms for Arbitrary Precision Floating Point Arithmetic, pp.111-124, On Property of Floating Point Arithmetics: Numerical Stability and the Cost of Accurate Computations, PhD thesis, University of California, Berkeley, November 1992.
【非特許文献3】Yozo Hida, Xiaoye S. Li, David H. Bailey, Library for Double-Double and Quad-Double Arithmetic, 29 December 2007.
【発明の概要】
【発明が解決しようとする課題】
【0006】
以上を鑑みると、固定精度浮動小数点数の組を丸め対象とした場合に、丸め演算を効率的に実現する演算方式が望まれる。
【課題を解決するための手段】
【0007】
丸め対象データの丸めを行なう演算回路は、N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタと、前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数する第1の先行ゼロ計数部と、前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出する指数生成部と、前記指数生成部が生成した丸め指数部と、丸めを行う桁に加算される丸め加算値を保持する第1の出力レジスタを有することを特徴とする。
【0008】
丸め対象データの丸めを行なう演算回路と、前記演算回路の演算結果を丸める場合の丸め前処理を制御する丸め前処理命令をデコードする命令制御部とを有する演算処理装置において、前記演算回路は、N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタと、前記命令制御部による前記丸め前処理命令のデコード結果に基づき、前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数する第1の先行ゼロ計数部と、前記命令制御部による前記丸め前処理命令のデコード結果に基づき、前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出する指数生成部と、前記指数生成部が生成した丸め指数部と、丸めを行う桁に加算される丸め加算値を保持する第1の出力レジスタを有することを特徴とする。
【0009】
N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタとを有する丸め対象データの丸めを行なう演算回路の制御方法は、前記演算回路が有する第1の先行ゼロ計数部が、前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数し、前記演算回路が有する指数生成部が、前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出して丸めを行う桁に加算される丸め加算値を出力することを特徴とする。
【発明の効果】
【0010】
本願開示の少なくとも1つの実施例によれば、固定精度浮動小数点数の組を丸め対象とした場合に、丸め演算を効率的に実現する演算方式が提供される。
【図面の簡単な説明】
【0011】
【図1】Oracle−numberの具体例の表を示す図である。
【図2】コンピュータシステムの構成の一例を示す図である。
【図3】oraclenum64の構成を示す図である。
【図4】長さが9バイトのoraclenum64の構成を示す図である。
【図5】oraclenum64を直接演算対象とできる演算器の構成の一例である。
【図6】指数仮数演算回路の構成の一例を示す図である。
【図7】正規化回路の構成の一例を示す図である。
【図8】先行ゼロ計数回路の構成の一例を示す図である。
【図9】内部形式変換回路の構成の一例を示す図である。
【図10】外部形式変換回路の構成の一例を示す図である。
【図11】固定精度浮動小数点数加算の具体例を示す図である。
【図12】固定精度浮動小数点数加算の別の具体例を示す図である。
【図13】21バイト長のOracle−numberを3つの部分に分ける方法を示す図である。
【図14】分割された3つの仮数部にそれぞれ対応するoraclenum64数を生成する方法を示す図である。
【図15】get_z演算を実現する回路の構成の一例を示す図である。
【図16】get_z演算の具体例を示す図である。
【図17】get_z演算の別の具体例を示す図である。
【図18】get_z演算の更に別の具体例を示す図である。
【図19】2つの入力値の絶対値がフォーマットの桁数以上離れている場合の加算演算の例を示す図である。
【図20】get_zz演算を実現する回路の構成の一例を示す図である。
【図21】get_zz演算の具体例を示す図である。
【図22】get_zz演算の別の具体例を示す図である。
【図23】get_zz演算の更に別の具体例を示す図である。
【図24】two_sumの回路図シンボルを示す図である。
【図25】triple−oraclenum64とoraclenum64の和を求める回路の一例を示す図である。
【図26】triple−oraclenum64同士の和を求めるアルゴリズムを示す図である。
【図27】オーバーラップを除去するための3つのtwo_sum演算子の接続を示す図である。
【図28】符号の揃ったPriestの再正規化の例を示す図である。
【図29】符号の揃ったPriestの再正規化された数の組から強い正規化された数の組を得る計算の一例を示す図である。
【図30】量子化のためのscale_next(X,Y)演算を実現する回路構成の一例を示す図である。
【図31】仮数部を内部形式に変換せずにscale_next演算を行う回路の構成の一例を示す図である。
【図32】Oracle−DatabaseにおけるNUMBER型の3種類の精度指定方法を示す表である。
【図33】四捨五入が発生する桁位置のみ5があるような数を生成するアルゴリズムの例を示す図である。
【図34】get_comma5演算を実現する回路構成の一例を示す図である。
【図35】truncate演算を実現する回路構成の一例を示す図である。
【図36】マスク値生成回路の構成の一例を示す図である。
【図37】p_d及びp_sの絶対値大小比較エラー判定回路の構成の一例を示す図である。
【図38】符号演算器の回路構成の一例を示す図である。
【図39】Oracle−numberの長さを求める演算の一例を示す図である。
【図40】expand演算を実現する回路の構成の一例を示す図である。
【図41】後続ゼロ計数回路の構成の一例を示す図である。
【図42】桁セレクト演算回路の構成の一例を示す図である。
【図43】固定精度浮動小数点加減算器の構成の一例を示す図である。
【図44】指数仮数マスク演算回路の構成の一例を示す図である。
【発明を実施するための形態】
【0012】
まず、固定精度の浮動小数点数の組を用いて多倍長や可変長の浮動小数点演算を行う場合における丸め演算の問題を考える。多倍長の浮動小数点は、符号と指数を含む1つの整数である第1バイト、及び、仮数部を示す整数列である第2乃至第Nバイト(Nは3以上の整数)とを含む。仮数部のバイト数が任意の数であってよい表現形式であれば、多倍長でありながら且つ可変長である浮動小数点の数が得られることになる。多倍長や可変長の浮動小数点の具体的な表現形式としては、BCD(Binary Coded-Decimal:2進化10進数)やOracle−Database(商標)形式など様々な形式があり得る。多倍長浮動小数点数の演算を、固定精度浮動小数点演算を用いて実現するには、多倍長の数を複数の部分に分割し、固定精度浮動小数点数の組で表現する。このためには、表現したい多倍長浮動小数点数の仮数部を、固定精度浮動小数点数の仮数部桁数に等しいt桁を含む複数の部分に分割し、各部をそれぞれ一つの固定精度浮動小数点数として表現する。その際、各部の指数部をtずつ減じることにより、仮数部がt桁ずつずれている分を、それぞれの固定精度浮動小数点数に反映させる。
【0013】
上述のような固定精度の浮動小数点数の組を用いて加減算等の算術演算を行なうことは、非特許文献1乃至3等にも開示されており、計算方法が確立されている。しかし、ユーザ指定により任意の桁位置で丸める方法については、別途考える必要がある。
【0014】
一例としてOracle−Database(商標)におけるNUMBER型の3種類の精度指定方法を用いて、丸め演算について説明する。図32は、このNUMBER型の3種類の精度指定方法を示す表である。
【0015】
図32の表の1番目に示す精度指定なしの場合には、NUMBER型の最大精度となるように演算結果が丸められる。従って、演算においては、NUMBER型の最大精度よりも少なくとも一桁多い内部精度が必要となる。
【0016】
表の2番目に示す桁数による精度指定の場合には、ユーザ指定の桁数となるように演算結果が丸められる。表の3番目に示す桁数とスケール指定による丸め位置指定の場合には、スケールにより決まる丸め位置において丸められた結果が、指定された桁数に収まるように、丸め演算の結果を生成する。丸め演算結果の値が、指定スケールでは指定精度の桁数に収まらない場合には、エラーとなる。また、桁数による精度指定の場合に1の位以上に不正確な結果が出た場合もエラーとなる。
【0017】
これらの全ての指定方法について、効率のよい丸め演算を実現することを考える。また上記のエラーが発生する場合について、エラー発生を素早く判定する方法が必要となる。なお丸め方向としては、四捨五入(Nearest, ties away from 0)を考慮対象とする。
【0018】
ここで、前述のような固定精度の浮動小数点数の組を用いて多倍長や可変長の浮動小数点演算を行う場合における丸めの問題を考えているので、丸め演算を1命令で実現するような演算器を想定することはできない。何故なら演算器の入出力は、固定精度の浮動小数点数の組の内の1つの固定精度の浮動小数点に対応するからである。固定精度の浮動小数点数の組の演算を前提に、丸め演算を適切に実行する。
【0019】
そこで、丸め処理(ここでは丸めモードとして四捨五入のみ考える)を、以下の3つの段階に分解して考える。
【0020】
1)四捨五入が発生する桁位置のみβ/2があるような数を生成する(βは基数:基数が10の場合はβ/2=5)。
【0021】
2)固定精度浮動小数点数の組に、上で生成した数を加える。
【0022】
3)適切な桁位置で切捨てを行う。
これら3つの段階のうち、第2段階の加算演算については、例えば非特許文献1乃至3に記載されるような固定精度浮動小数点数の組に対する算術を用いればよい。ここでは、第1段階及び第3段階の演算を行う専用の命令を用意する方法を考える。
【0023】
スケール指定がある場合については、第1段階の処理は、丸め対象の数には依存せず、スケール指定のみによって決まる。例えば、「小数点第1位まで」と指定された場合には、丸め対象の数に関わらず、加えるべき数は0.05(基数が10の場合)である。
【0024】
それに対し精度指定の場合には、加えるべき数は、丸め対象の数値に依存する。例えば、4桁精度に丸める場合、丸め対象が1.23456のときには、四捨五入のために加えられるべき数字は0.0005である。1.23456+0.0005=1.23506となり、この加算結果の4桁目より後ろを切り捨てることにより、1.235が得られる。しかし例えば丸め対象が12.3456なら、加えるべき値は0.005となる。
【0025】
このように丸め対象の値に依存する第1段階の処理を、正規化された固定精度の浮動小数点数の組に対して実行する場合、組の要素のうちの最重要部(most significant part)の1要素の値と指定精度との2つの入力を用いればよい。そしてこれら2つの入力に基づいて、適切な桁位置にのみβ/2(例えば5)があるような数p_dを生成する以下のget_comma5命令を用意すればよい。
【0026】
p_d = get_comma5(a0, digits=n)
ここで、a0は、固定精度の浮動小数点数の組の最重要部(最上位桁部分)であり、nは丸め後の桁数の指定である。後述の実施例で詳細に説明するように、この処理を行う命令を用意し、1命令でこの処理が実現できるようなハードウエアを用意する。
【0027】
第3段階についても、固定精度の浮動小数点数演算器によるアシスト命令を用意する。上記の第1段階で生成した数値p_dは、四捨五入のために加算されるべき数であると同時に、丸め位置についても完全な情報を含んでいる。そこで、この数により指定された位置で切捨てを実行する命令を用意すればよい。
【0028】
この命令を用いると、浮動小数点の組(a0,a1,a2,・・・)で表現された数(第2段階の加算を実行後の数)の丸め演算は、次のように実現される:
rounded_value = Σ truncate(a_i, p_d)
スケール指定による丸め演算の場合には、加算すべき数p_sは、丸め対象の数によらずスケール指定の値s(桁位置の指定値)を入力とする命令により、以下のように求めることができる。
【0029】
p_s = get_comma5(scale=s)
このp_sを用いて、四捨五入のための加算演算及びtruncateを実行すれば、スケール指定時の丸め演算も、精度指定の場合の丸め演算と同様に実現できる。
【0030】
またスケール指定があった場合に、丸めた結果が指定精度に収まるか否かは、以下のように判定できる。まず、上述の精度指定の場合のアルゴリズムとスケール指定のアルゴリズムとを両方用いて、p_d及びp_sの2つの値を計算する。
【0031】
p_d = get_comma5(a0, digits=n)
p_s = get_comma5(scale=s)
このとき、|p_d|>|p_s|となった場合、すなわちp_dの絶対値がp_sの絶対値よりも大きい場合には、スケール指定で丸められた結果を表現するためには、精度が不足していることがわかる。精度が不足している場合には、丸め処理を実施せずにエラーを報告すればよい。
【0032】
以下に、本発明の実施例を添付の図面を用いて詳細に説明する。なお各図面において、同一又は対応する構成要素は同一又は対応する名称又は番号で参照し、その説明は適宜省略する。
【0033】
以下に説明する実施例では、オラクルデータベース(商標)で用いられる数値型であるOracle−number(商標)を数値表現の一例として用い、これを高速に計算するハードウエアが提供される。まず、Oracle−numberの表現形式について述べる。ここで述べる事柄は、オラクルデータベースのSQLインタプリタ(Structured Query Language interpreter)上で確認することができる。
【0034】
Oracle−numberは、最大21バイトの可変長データ形式である。第1バイトに符号及び指数が格納され、後続バイトに仮数が格納される。仮数部は最大で20バイトである。
【0035】
Oracle−numberは、10進浮動小数点数を表現するためのデータ形式である。主にメモリ使用効率上の理由から、仮数部は、1バイトあたり10進2桁分のデータを保持する。またそれにあわせて、指数部は、基数100に対する指数が格納される。Oracle−numberで表現される数は、以下の形式で表すことができる。
【0036】
number = ± (M00 . M01 M02 ...) * 100^(exp)
ここでM00、M01、M02、・・・は、最大20バイトで表現される仮数部における第1バイト、第2バイト、第3バイト、・・・の各バイトの格納データを示す。仮数部は10進2桁毎に区切られているため、100進20桁とみなすこともできる。Oracle−numberは、この100進表現でみなしたときに必ず正規化されており、M00部(仮数部第1バイト)が0になることはない。
【0037】
Oracle−number表現の第1バイト(全体の第1バイト)は、符号及び指数部であり、次のように符号化される。
【0038】
number > 0 の場合:第1バイト = exp + 193
number == 0 の場合:第1バイト = 128
それ以外の場合:第1バイト = 62 - exp
第2バイト以降の仮数部は、バイト毎にM00、M01、・・・を保持する。各バイトにおいては、表現する数値の符号に応じて、以下に示すように異なった符号化がもちいられる。
【0039】
number > 0 の場合:仮数部の第nバイト = M(n-1) + 1
number == 0 の場合:仮数部はない
それ以外の場合:仮数部の第nバイト = 101 - M(n-1)
上記の符号化において、Mnは0以上且つ99以下であるので、仮数部バイトの値に0X00が出現することがない。表現対象の数が短い仮数部で表現可能な場合には、Oracle−numberは21バイトよりも短く切り詰められる。即ち、Oracle−numberの仮数部には後続ゼロは許されていない。なお負数の表現においては、仮数部が 20バイトよりも短い場合には、仮数の終端を示すため、最後のバイトにターミネータとして102(0X66)が格納される。
【0040】
Oracle−numberでは、上記のような符号化方式を採用することで、バイト列としてみたときの大小関係、即ちC標準関数memcmpによる比較に基づく大小関係と、Oracle−numberの数値としての大小関係とが等しくなる。
【0041】
図1は、Oracle−numberの具体例の表を示す図である。例えば10E+0(=10×1000)の表現において、指数部は193(=0+193)であり、仮数部は11(=10+1)である。また例えば10E+1(=1×1001)の表現において、指数部は194(=1+193)であり、仮数部は2(=1+1)である。また例えば負の数−10E−130(=−10×100−65)の表現において、指数部は127(=62−(−65))であり、仮数部は91(=101−10)である。また例えば負の数−10E−129(=−1×100−64)の表現において、指数部は126(=62−(−64))であり、仮数部は100(=101−1)である。なお負の数には、最後のバイトにターミネータとして102が付加されている。更に、正の無限大Inf及び負の無限大−Infには、表中に示すような特別なバイト列が割り当てられている。
【0042】
図2は、コンピュータシステムの構成の一例を示す図である。図2に示すコンピュータシステムは、プロセッサ110及びメモリ111を含む。演算処理装置としてのプロセッサ110は、2次キャッシュ部112、1次キャッシュ部113、制御部114、及び演算部115を含む。1次キャッシュ部113は、命令キャッシュ113A及びデータキャッシュ113Bを含む。演算部115は、レジスタ116、演算制御部117、及び演算器118を含む。演算器118には演算回路119が含まれる。なお図2及び以降の同様の図において、各ボックスで示される各機能ブロックと他の機能ブロックとの境界は、基本的には機能的な境界を示すものであり、物理的な位置の分離、電気的な信号の分離、制御論理的な分離等に対応するとは限らない。各機能ブロックは、他のブロックと物理的にある程度分離された1つのハードウェアモジュールであってもよいし、或いは他のブロックと物理的に一体となったハードウェアモジュール中の1つの機能を示したものであってもよい。各機能ブロックは、他のブロックと論理的にある程度分離された1つのモジュールであってもよいし、或いは他のブロックと論理的に一体となったモジュール中の1つの機能を示したものであってもよい。
【0043】
上記コンピュータシステムはCPU(Central Processing Unit)を用いた情報処理装置を模式化したものであり、このコンピュータシステムによりOracle−numberを演算するハードウエアを実現する。その際、システム構成を大幅に変更することなく、新機能を演算部115の機能として追加することが望まれる。そこで、新機能追加による変更部分が可能な限り少なくなるような実現方法をめざす。例えば、現状のCPUにおいては、演算器の入出力は、通常2オペランド入力且つ1出力の形であり、各オペランドのデータ幅は8バイト(64ビット)幅である。ハードウエアの変更量を小さく抑えるためには、この構造を大きく変えないことが望まれる。
【0044】
プロセッサ110では、1次キャッシュ部113及び2次キャッシュ部112を設けることにより、キャッシュメモリを多階層化した構成となっている。具体的には、1次キャッシュ部113と主記憶(メモリ111)との間に、主記憶よりも高速にアクセスできる2次キャッシュ部112を設けている。これにより、1次キャッシュ部113においてキャッシュミスが発生した場合に、主記憶にアクセスが必要になる頻度を低くして、キャッシュミス・ペナルティーを軽減することができる。
【0045】
制御部114は、命令フェッチアドレスと命令フェッチリクエストとを1次命令キャッシュ40に発行し、この命令フェッチアドレスから命令をフェッチする。制御部114は、フェッチした命令をデコードした結果に従い演算部115を制御して、フェッチされた命令を実行する。演算制御部117は、制御部114の制御下で動作し、演算対象のレジスタ116からのデータを演算器118に供給したり、演算結果のデータを指定されたレジスタ116に格納したりする。また演算制御部117は、演算器118が実行する演算のタイプを指定する。更に演算制御部117は、アクセス先のアドレスを指定し、1次キャッシュ部113の当該アドレスに対してロード命令やストア命令を実行する。ロード命令により、指定アドレスから読み出されたデータは、指定されたレジスタ116に格納される。またストア命令により、指定されたレジスタ116のデータが、指定されたアドレスに書き込まれる。
【0046】
まず、Oracle−numberのサブセットであるoraclenum64を定義する。oraclenum64は有効な仮数部の長さが7バイト以下であるようなOracle−numberである。
【0047】
図3は、oraclenum64の構成を示す図である。oraclenum64の数を表現するデータ121は、8バイト長のレジスタに格納することができる。なお、符号及び指数部を含めた長さが8バイトに満たないOracle−numberをoraclenum64としてレジスタに格納する際には、図3にバイト122として示すようにデータを左詰めにして格納する。そして右側の余りの部分には、0X00の値を有するバイト123を余りのバイト数に等しい数だけ格納する。
【0048】
図4は、長さが9バイトのoraclenum64の構成を示す図である。図4に示すように、長さが9バイトである負のOracle−numberのデータ125は、7バイト長の仮数部126に続いて最後のバイト(第9バイト)にターミネータ127(0X66)が付加されている。このOracle−numberは、有効な仮数部126の長さが7バイトであるので、oraclenum64である。このことはoraclenum64を符号反転した数が必ずoraclenum64となるために必要である。
【0049】
図5は、oraclenum64を直接演算対象とできる演算器の構成の一例である。図5の演算器は、図2の演算回路119の一部分に相当する。図5に示す演算器は、入力Xレジスタ131、入力Yレジスタ132、内部形式変換回路133及び134、指数仮数演算回路135、セレクタ136及び137、シフタ138及び139、指数加算器140、及び絶対値加算器141を含む。演算器は更に、正規化回路142、丸め回路143、外部形式変換回路144、及び出力Zレジスタ145を含む。内部形式変換回路133及び134と外部形式変換回路144とを工夫することで、例えばoraclenum64とIEEE754−decimal64との両方に対応させることも可能である。図5において、入力と出力は同形式同精度の浮動小数点数とする。入力データは正規化されていなくてもよい。出力データは正規化される。入力データはoraclenum64フォーマットとし、正規化されていないデータも解釈可能である。出力データはoraclenum64フォーマットの通りに出力される。
【0050】
内部形式変換回路133及び134により、入力を符号部、指数部、及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの符号、指数、仮数をそれぞれ符号X、指数X、仮数Xとする。入力Yの符号、指数、仮数をそれぞれ符号Y、指数Y、仮数Yとする。
【0051】
指数仮数演算回路135が、指数X及び指数Yと、仮数X及び仮数Yとを受け取る。指数仮数演算回路135は、指数Xと指数Yの大小比較をする。大小比較の結果に基づいて、指数仮数演算回路135は、指数の大きい側の仮数(第1の仮数)がシフタ138に入力され、且つ、指数の小さい側の仮数(第2の仮数)がシフタ139に入力されるように、セレクト信号を生成する。指数仮数演算回路135は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、指数Xと指数Yとの差の絶対値の方が大きい場合は、第1の仮数の先行ゼロ計数値をシフタ138の左シフト量として出力する。指数Xと指数Yとの差の絶対値の方が小さい場合は、指数仮数演算回路135は、指数Xと指数Yとの差の絶対値をシフタ138の左シフト量として出力する。ここで、先行ゼロ計数値とは、仮数部の最上位桁から連続するゼロを計数した値をいう。
【0052】
指数仮数演算回路135は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、指数Xと指数Yとの差の絶対値の方が大きい場合は、指数Xと指数Yとの差の絶対値から第1の仮数の先行ゼロ計数値を減算した値をシフタ139の右シフト量として出力する。指数Xと指数Yとの差の絶対値の方が小さい場合は、指数仮数演算回路135は、ゼロをシフタ139の右シフト量として出力する。指数仮数演算回路135は更に、指数の小さい側に上述の右シフト量を加算した値を指数として出力する。
【0053】
シフタ138は、入力されたシフト量に基づき、入力された仮数を左シフトする。シフタ139は、入力されたシフト量に基づき、入力された仮数を右シフトする。各シフタのシフト結果は絶対値加算器141に入力される。
【0054】
減算の場合は、片方の仮数が反転され、絶対値加算器141にキャリーが入力される。絶対値加算器141による加算の結果桁あふれが生じた場合は、1桁右にシフトした値が出力される。同時に、絶対値加算器141から指数加算器140にキャリーが送られ、送られたキャリーが指数に加算される。
【0055】
絶対値加算器141による加算の結果桁落ちが生じた場合は、1桁左にシフトした値が出力される。同時に、絶対値加算器141から指数加算器140に桁落ちを示す信号が送られ、指数から減算される。乗算や除算の場合は、加算結果を再利用するループ演算回路を用いてもよい。
【0056】
正規化回路142が加算結果を受け取り、正規化演算結果を出力する。丸め回路143が、正規化演算結果を丸める。外部形式変換回路144は、丸め処理後の正規化演算結果を外部形式に変換し、出力Zレジスタ145に出力する。
【0057】
図6は、指数仮数演算回路の構成の一例を示す図である。図6に示す指数仮数演算回路135は、比較回路151、絶対値加算器152、セレクタ153及び154、加算器155、先行ゼロ計数回路156、セレクタ157及び158、及び加算器159を含む。
【0058】
比較回路151は、指数Xと指数Yとの大小比較をし、指数の大きい側の仮数(第1の仮数)がシフタ138に入力され、指数の小さい側の仮数(第2の仮数)がシフタ139に入力されるように、セレクト信号を生成する。絶対値加算器152は、指数Xと指数Yの差の絶対値を計算する。先行ゼロ計数回路156は、セレクトされた仮数の先行ゼロを計数する。加算器155は、指数Xと指数Yとの差の絶対値とセレクトされた仮数の先行ゼロ計数値とを比較し、比較結果に応じたセレクト信号を出力する。セレクタ158は、差の絶対値の方が大きい場合、先行ゼロ計数値をシフタ138の左シフト量として出力する。セレクタ158は、差の絶対値の方が小さい場合、差の絶対値をシフタ138の左シフト量として出力する。
【0059】
セレクタ157は、差の絶対値の方が大きい場合、差の絶対値から先行ゼロ計数値を減算した値をシフタ139の右シフト量として出力する。セレクタ157は、差の絶対値の方が小さい場合、ゼロをシフタ139の右シフト量として出力する。
【0060】
加算器159は、セレクタ153から小さい側の指数を受け取る。加算器159は、受け取った小さい側の指数に上述の右シフト量を加算して求めた値を、指数として出力する。
【0061】
図7は、正規化回路の構成の一例を示す図である。図7に示す正規化回路142は、先行ゼロ計数回路160、シフト量補正回路161、左シフタ162、指数演算器163、ビットシフタ164及び165、及びセレクタ166を含む。
【0062】
仮数は桁あふれを考慮する場合は最上位側が1桁多い幅で入力される。先行ゼロ計数回路160は、最上位桁の1つ上の桁を除いた仮数を受け取り、先行ゼロを計数することにより得られた計数値を出力する。シフト量補正回路161は、先行ゼロ計数値と指数の最下位ビットとを受け取る。先行ゼロ計数値の最下位ビット(偶奇を表す)と指数の最下位ビットとをXOR(排他的論理和)した値が1の場合、シフト量補正回路161は、先行ゼロ計数値から1を減じた値を左シフト量として出力する。また上記XOR値が0の場合、シフト量補正回路161は、先行ゼロ計数値を左シフト量として出力する。
【0063】
左シフタ162は、最上位桁の1つ上の桁を除いた仮数とシフト量とを受け取り、指定されたシフト量だけ仮数を左シフトした値を出力する。セレクタ166は、入力の最上位桁の1つ上の桁が0の場合、左シフタ162が出力する左シフトした結果を選択する。またセレクタ166は、入力の最上位桁の1つ上の桁が1であり且つ指数の最下位ビットが0の場合、最上位桁の1つ上の桁を含む入力仮数を2桁右シフトした値を選択する。またセレクタ166は、入力の最上位桁の1つ上の桁が1であり且つ指数の最下位ビットが1の場合、最上位桁の1つ上の桁を含む入力仮数を1桁右シフトした値を選択する。セレクタ166の選択した値は、仮数として出力される。
【0064】
指数演算器163は、指数、シフト量、及び入力仮数の最上位桁を受け取る。入力仮数の最上位桁が0の場合、指数演算器163は、指数からシフト量を減算した結果を指数として出力する。入力仮数の最上位桁が1であり且つ指数の最下位ビットが0の場合、指数演算器163は、指数に2を加算した結果を指数として出力する。入力仮数の最上位桁が1であり且つ指数の最下位ビットが1の場合、指数演算器163は、指数に1を加算した結果を指数として出力する。
【0065】
図8は、先行ゼロ計数回路の構成の一例を示す図である。図8(a)に示すように、先行ゼロ計数回路は、変換回路160を含む。変換回路160は仮数を入力データとして受け取り、図8(b)に示すテーブルに従い入力データから出力データを生成する。この出力データが先行ゼロ計数値であり、2進数により計数値が表わされる。テーブルでは、一番左側のXはゼロ以外の値を表し、それ以外のXはドントケアを表す。0は計数対象となるゼロを表す。
【0066】
図9は、内部形式変換回路の構成の一例を示す図である。図9に示す内部形式変換回路133又は134は、セレクタ170乃至174、加算器175及び176、及び2進10進変換回路177及び178を含む。
【0067】
入力されたデータは、符号部S、指数部EXP、仮数部M01、M02、・・・に分割される。符号部Sは1ビットであり、符号としてそのまま出力される。符号は1の場合に正を表す。
【0068】
指数部EXPは7ビットである。セレクタ170は、符号が1の場合、指数部EXPをそのまま指数として出力する。またセレクタ170は、符号が0の場合、指数部EXPを反転した値を指数として出力する。
【0069】
仮数部M01、M02、・・・の各々は、8ビット長のデータである。セレクタ171は、符号が1の場合は仮数を選択し、符号が0の場合は仮数の反転値を選択する。この選択値が加算器175の一方の入力となる。またセレクタ172は、符号が1の場合は−1を選択し、符号が0の場合は+101を選択する。この選択値が加算器175のもう一方の入力となる。また、符号が0の場合には、加算器175にキャリーが入力される。セレクタ173及び174並びに加算器176についても同様である。
【0070】
加算器175及び176の出力が、それぞれ、2進10進変換回路177及び178により2進形式からBCD形式の値に変換され、BCD変換後の値が仮数として出力される。ただし、加算器からのCOが0の場合には、変換後のBCD値は強制的にゼロとなる。
【0071】
図10は、外部形式変換回路の構成の一例を示す図である。図10に示す外部形式変換回路144は、デコーダ180、10進2進変換回路181及び182、セレクタ183乃至187、及び加算器188及び189を含む。図10では、2つの仮数部BCD01、BCD02のみに対する回路部分が明示的に示されるが、仮数部の数が2以上の場合には、同様の回路部分がそれらの仮数部に対して設けられる。
【0072】
入力された1ビットの符号部は、そのまま符号として出力される。符号は1の場合に正を表す。指数部の入出力は7ビットである。セレクタ値183により、符号が1の場合は入力指数がそのまま出力指数となり、符号が0の場合は入力指数の反転値が出力指数となる。仮数部BCD01、BCD02、・・・は、1つの入力BCDあたり8ビットであり、10進2進変換回路181、182、・・・によりBCDから2進数に変換される。
【0073】
ターミネータ選択信号を受け取るデコーダ180は、終端の桁を現すターミネータ桁を選択するターミネータ桁セレクト信号を生成する。このターミネータ桁セレクト信号は、後段のセレクタ184、185、・・・に分配される。
【0074】
加算器188、189、・・・の各々において、一方の入力には、符号が1の場合は仮数がそのまま入力され、符号が0の場合は仮数の反転値が入力される。但し、ターミネータ桁セレクト信号が1の場合は、ゼロが選択されて入力される。もう一方の入力には、符号が1の場合は+1が入力され、符号が0の場合は+101が入力される。但し、ターミネータ桁セレクト信号が1の場合は、+101が選択されて入力される。ここで実際に加算したい値は+102であるが、+101にキャリーインが加算されることで、+102を加算することと同等になる。また、符号が0の場合には加算器にキャリーインが入力される。加算器188、189、・・・の出力が、各桁の仮数として出力される。
【0075】
図11は、固定精度浮動小数点数加算の具体例を示す図である。図11において、入力Xの指数をEx、入力Yの指数をEy、入力Xの先行ゼロ計数値をLx、入力Yの先行ゼロ計数値をLyとする。また出力Zの指数をEzとする。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうため、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。このためにEx−Eyを計算し、Lxと比較する。図11に示す具体例ではLxのほうが大きい。即ち、左シフト量Ex−Eyが先行ゼロの数内に収まるので、入力Xの仮数191のみ左シフトされる。入力Yの仮数192は右シフトされない。左シフト量はEx−Eyであり、右シフト量は0である。
【0076】
このようにして桁合わせされた数同士、即ち仮数191を左シフトして得られた仮数193と仮数192とを加算する。更に、加算結果194を正規化し、先行ゼロ計数値が1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁左シフトが必要だが、指数が0から1となり奇数になるので、左シフト量は1減らされて0となり、指数は0のままである。その結果、正規化により加算結果は変化せず、そのまま演算結果の仮数194及び対応する指数Ezを含む演算結果として出力される。
【0077】
図12は、固定精度浮動小数点数加算の別の具体例を示す図である。この具体例では必要な左シフト量Ex−EyよりもLxのほうが小さい。この場合、必要な左シフト量Ex−Eyが先行ゼロ計数値の数内に収まらないので、入力Xの仮数201をLx分だけ左シフトし、左シフトしきれなかった分だけ入力Yの仮数202を右シフトする。即ち、左シフト量はLxであり、右シフト量は(Ex−Ey)−Lxである。
【0078】
このようにして桁合わせされた数同士、即ち仮数201を左シフトして得られた仮数203と仮数202を右シフトして得られた仮数204とを加算する。このとき、右シフトによって溢れた桁も保持する。更に、加算結果205を正規化し、先行ゼロ計数値が1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁右シフトが必要だが、指数Ezが2から3となり奇数になるので、右シフト量は1増やされて2となり、指数Ezは2から4となる。
【0079】
その後、正規化した結果206に対して丸め処理を実行する。この例においては右にはみ出した桁を四捨五入することにより実行される。このようにして丸められた結果が、丸め結果の仮数207及び対応する指数Ezを含む演算結果として出力される。
【0080】
以下に、1つのOracle−numberを複数のoraclenum64を含む組により表現する方法について説明する。
【0081】
最大で21バイト長のOracle−numberの計算を、oraclenum64 演算ハードウエアを用いて実現するためには、Oracle−numberを複数のoraclenum64を含む組で表現する必要がある。
【0082】
図13は、21バイト長のOracle−numberを3つの部分に分ける方法を示す図である。図22に示されるように、最大20バイト長の仮数部210は、7バイトの仮数部211、7バイトの仮数部212、及び6バイトの仮数部213に分割される。
【0083】
図14は、分割された3つの仮数部にそれぞれ対応するoraclenum64数を生成する方法を示す図である。a0については、元のOracle−numberの先頭8バイト部分(1バイトの符号及び指数部214+7バイトの仮数部211)を切り出してくるだけで、oraclenum64形式の数が得られる。a1及びa2については、元のOracle−numberの第1バイト(符号及び指数部214)を加工する必要がある。具体的には、元のOracle−numberの基数10での指数をEとして、a1の指数E1=E−14とすることで、a1についての1バイトの符号及び指数部215を生成する。この符号及び指数部215に7バイトの仮数部212を付加して、a1に相当するoraclenum64形式の数が得られる。またa2の指数E2=E−28とすることで、a2についての1バイトの符号及び指数部216を生成する。この符号及び指数部216に6バイトの仮数部213及び1バイトの"0"を付加して、a2に相当するoraclenum64形式の数が得られる。このようにして得られた3つのoraclenum64の組を、以下においてtriple−oraclenum64と呼ぶ。
【0084】
以下に、triple−oraclenum64形式に対する四則演算をoraclenum64演算器により実行する構成について説明する。まず、最も基本となる、oraclenum64の数同士の正確な和を求める演算について説明する。以下に示すtwo−sum(2数の和)は、非特許文献1にformula(4.16)として示されているものであり、同様のものが非特許文献2のp.18、及び、非特許文献3のalgorithm4に示されている。
【0085】
Two_sum(X, Y)
z = fl(X + Y)
w = fl(z - X)
v = fl(z - w)
z1 = fl(Y - w)
z2 = fl(v - X)
zz = fl(z1 - z2)
return(z, zz)
ここでfl(X+Y)は、X+Yの真の値を、浮動小数点数にマッピングした結果、即ち浮動小数点形式の限られた精度内で表現した結果を示す。上記のTwo_sumによって得られる2数z及びzzは、正確な意味においてz+zz=X+Yを満たす。zはX+Yの最重要部(most significant part)を固定精度浮動小数点の精度内で表現した値であり、zzは固定精度浮動小数点の精度で表現しきれなかった残余分を表す。
【0086】
マッピング時に発生する丸め処理方法として、10進数で代表的な丸め方法である四捨五入を例に取り説明する。簡単のために固定精度浮動小数点数の精度は10進2桁とする。この場合、20000と−1との2数の和は、上記のTwo_sumにより以下のように計算される。
【0087】
X = 20000
Y = -1
z = fl(X+Y) = 20000
w = fl(z−X) = 0
v = fl(z−w) = 20000
z1 = fl(Y−w) = -1
z2 = fl(v−X) = 0
zz = fl(z1−z2) = -1
この例のように、一般に、two_sumの結果であるzとzzは異符合となり得る。一方、丸め方法を切り捨てとした場合は、XとYとで有効桁がオーバーラップしない場合には、以下の例のようにz+zzがX+Yと等しくならない場合がある。
【0088】
X = 20000
Y = -1
z = fl(X+Y) = 19000
w = fl(z−X) = -1000
v = fl(z−w) = 20000
z1 = fl(Y−w) = 990
z2 = fl(v−X) = 0
zz = fl(z1−z2) = 990
ここで、Xの絶対値がYの絶対値より大きいか等しいと仮定し、更に以下のような新たな丸め処理を行うことにより、zzの算出が容易になることを示す。
【0089】
(1)XとYとの間で有効桁のオーバーラップが無い場合は四捨五入する
(2)XとYとの間で有効桁のオーバーラップがある場合は切り捨てる
但し、XとYとの間で有効桁がオーバーラップしていない場合であっても、XとYとの間で有効桁が連続している場合は(2)に含めることにする。
【0090】
具体的な例を用いて、上記のような丸め処理を適用することの効果を説明する。前述の場合と同様に固定精度浮動小数点数の精度は10進2桁である。また、XとYとの間で有効桁が連続している場合の例を示す。まず上記の特殊な丸め処理ではなく、flが常に四捨五入の丸め処理を行なう場合には、以下のようになる。
【0091】
X = 2000
Y = 52
z = 2100
w = 100
v = 2000
z1 = -48
z2 = 0
zz = -48
それに対して、上記の新たな丸め処理を用いる場合は、以下のようになる。
【0092】
X = 2000
Y = 52
z = 2000
w = 0
v = 2000
z1 = 52
z2 = 0
zz = 52
上記の新たな丸め処理を用いることにより、以下の効果が得られる。まず(1)の場合には、オーバーラップがないので、X+Yを行った後の四捨五入による丸め処理や、四捨五入によって発生したwを補正するために必要であったz1を求める演算処理がなくなる。また(2)の場合には、X+Yの精度は有効桁数の2倍以下であることが保証され、丸め処理が切り捨てのみとなるため、演算を実行するハードウエアの実現が容易となる。
【0093】
以上のことから、2つの入力値の絶対値を比較して、その比較結果に応じて上記の(1)又は(2)の場合分けを行ない、新たな丸め処理を実行すれば、zzの算出が容易となる。また更に、z,zzを求める演算get_z(x,y),get_zz(x,y)をハードウエアで実行する回路を設ければ、以下に示すように、two_sumを高速に処理することが可能となる。
【0094】
Two_sum_fast(x, y)
z = get_z(x, y)
zz = get_zz(x, y)
return(z, zz)
図15は、get_z演算を実現する回路の構成の一例を示す図である。図15の演算器は、図2の演算回路119の一部分に相当する。図15に示す演算器は、入力Xレジスタ221、入力Yレジスタ222、内部形式変換回路223及び224、指数仮数演算回路225、セレクタ226及び227、シフタ228及び229、指数加算器230、及び絶対値加算器231を含む。演算器は更に、セレクタ232及び233、正規化回路234、外部形式変換回路235、及び出力Zレジスタ236を含む。図15において、図5に示す回路と同一又は対応する構成要素は同一又は対応する名称で参照する。図15において、入力と出力は同形式同精度の浮動小数点数とする。入力データは正規化されていなくてもよい。出力データは正規化される。入力データはoraclenum64フォーマットとし、正規化されていないデータも解釈可能である。出力データはoraclenum64フォーマットの通りに出力される。
【0095】
内部形式変換回路223及び224により、入力を符号部、指数部、及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの符号、指数、仮数をそれぞれ符号X、指数X、仮数Xとする。入力Yの符号、指数、仮数をそれぞれ符号Y、指数Y、仮数Yとする。
【0096】
指数仮数演算回路225が、指数X及び指数Yと、仮数X及び仮数Yとを受け取る。指数仮数演算回路225は、指数Xと指数Yの大小比較をする。大小比較の結果に基づいて、指数仮数演算回路225は、指数の大きい側の仮数(第1の仮数)がシフタ228に入力され、且つ、指数の小さい側の仮数(第2の仮数)がシフタ229に入力されるように、セレクト信号を生成する。指数仮数演算回路225は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、前者の方が大きい場合は、後者をシフタ228の左シフト量として出力する。前者の方が小さい場合は、指数仮数演算回路225は、前者をシフタ228の左シフト量として出力する。
【0097】
指数仮数演算回路225は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、指数Xと指数Yとの差の絶対値の方が大きい場合は、指数Xと指数Yとの差の絶対値から第1の仮数の先行ゼロ計数値を減算した値をシフタ229の右シフト量として出力する。指数Xと指数Yとの差の絶対値の方が小さい場合は、指数仮数演算回路225は、ゼロをシフタ229の右シフト量として出力する。指数仮数演算回路225は更に、指数の小さい側に上述の右シフト量を加算した値を指数として出力する。
【0098】
指数仮数演算回路225は更に、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が14以上であるか否かを判定する。この絶対値が14以上である場合、指数仮数演算回路225は、第1の仮数と第1の仮数に対応する指数とがセレクタ232及び233により選択されるように、セレクト信号を生成する。これにより、上記絶対値が14以上である場合には、第1の仮数が、シフタ228及び絶対値加算器231をバイパスして、正規化回路234に入力されることになる。
【0099】
シフタ228は、入力されたシフト量に基づき、入力された仮数を左シフトする。シフタ229は、入力されたシフト量に基づき、入力された仮数を右シフトする。各シフタのシフト結果は絶対値加算器231に入力される。
【0100】
減算の場合は、片方の仮数が反転され、絶対値加算器231にキャリーが入力される。絶対値加算器231による加算の結果桁あふれが生じた場合は、1桁右にシフトした値が出力される。同時に、絶対値加算器231から指数加算器230にキャリーアウトが送られ、指数に加算される。
【0101】
絶対値加算器231による加算の結果桁落ちが生じた場合は、1桁左にシフトした値が出力される。同時に、絶対値加算器231から指数加算器230に桁落ちを示す信号が送られ、指数から減算される。
【0102】
セレクタ232及び233は、指数仮数演算回路225によって生成されたセレクト信号に応じて、加算結果の指数及び仮数、又は、第1の仮数及びそれに対応する指数を選択する。正規化回路234が、セレクタ232及び233により選択された指数及び仮数を受け取り、正規化演算結果を出力する。外部形式変換回路235は、正規化演算結果を外部形式に変換し、出力Zレジスタ236に出力する。
【0103】
図16は、get_z演算の具体例を示す図である。図16において、入力Xの指数をEx、入力Yの指数をEy、入力Xの先行ゼロ計数値をLx、出力Zの指数をEzとする。この例において実行する演算は、図16に示すget_z演算240である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうために不可能であるので、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。このためにEx−Eyを計算し、Lxと比較する。図16に示す具体例ではLxのほうが大きい。即ち、左シフト量Ex−Eyが先行ゼロの数内に収まるので、入力Xの仮数241のみ左シフトされる。入力Yの仮数242は右シフトされない。左シフト量はEx−Eyであり、右シフト量は0である。
【0104】
このようにして桁合わせされた数同士、即ち仮数241を左シフトして得られた仮数243と仮数242のままである仮数244とを加算する。更に、加算結果245を正規化し、先行ゼロ計数値が1以上の場合は先行ゼロ計数値だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁左シフトが必要だが、指数が0から1となり奇数になるので、左シフト量は1減らされて0となり、指数は0のままである。この例では、正規化による変化はない。更に正規化結果の仮数246の上位桁を選択する。例えば入力フォーマットの仮数が14桁である場合は、最上位から14桁を上位桁、最上位から15桁目以降を下位桁とする。
【0105】
上記の演算の結果、仮数247及び対応する指数Ezを含む演算結果が出力される。
【0106】
図17は、get_z演算の別の具体例を示す図である。この例において実行する演算は、図17に示すget_z演算250である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうために不可能であるので、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。このためにEx−Eyを計算し、Lxと比較する。図17に示す具体例ではLxのほうが小さい。即ち、左シフト量Ex−Eyが先行ゼロの数内に収まらないので、入力Xの仮数251をLx分だけ左シフトし、左シフトしきれなかった分だけ入力Yの仮数252を右シフトする。即ち、左シフト量はLxであり、右シフト量は(Ex−Ey)−Lxである。
【0107】
このようにして桁合わせされた数同士、即ち仮数251を左シフトして得られた仮数253と仮数252を右シフトして得られた仮数254とを加算する。このとき、右シフトによって溢れた桁も保持する。更に、加算結果255を正規化し、先行ゼロが1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁右シフトが必要だが、指数が2から3となり奇数になるので、右シフト量は1増やされて2となり、指数は2から4となる。このようにして得られた正規化の結果の仮数256の上位桁を選択する。例えば入力フォーマットの仮数が14桁である場合は、最上位から14桁を上位桁、最上位から15桁目以降を下位桁とする。
【0108】
上記の演算の結果、演算結果の仮数257が出力されるとともに、対応する指数Ezが演算結果の指数として出力される。
【0109】
図18は、get_z演算の更に別の具体例を示す図である。この例において実行する演算は、図18に示すget_z演算260である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうため、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。但し、桁合わせした結果、2つの入力の間に14桁以上の差がある場合、即ち、重なりが全くない場合には、実際に演算処理を実行しなくとも演算結果を求めることが可能である。get_zは演算結果の上位側を求める演算であり、2入力の重なりがない場合には値の大きい側がそのまま上位側となるからである。
【0110】
この条件を満たすか否かを確認するため、(Ex−Lx)−(Ey−Ly)を計算し、計算結果が14以上の場合には上記の場合に該当すると判定する。ここで値14は、使用フォーマットにおける仮数の桁数である。この具体例では上記の場合に該当し、仮数261と仮数262との間に重なりが存在しない。この場合、仮数261がそのままバイパスされて加算結果として取り扱われる。
【0111】
更にバイパスされた結果263を正規化し、先行ゼロ計数値が1以上の場合は先行ゼロ計数値だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では3桁左シフトが必要だが、指数が16から13となり奇数になるので、左シフト量は1減らされて2となり、指数は16から14となる。このようにして得られた正規化の結果が、そのまま演算結果の仮数264及び対応する指数Ezを含む演算結果として出力される。
【0112】
なおzzは固定精度の範囲で表現しきれなかった加算演算の残余の部分を表すが、例えば乗算の場合にはzzを出力する命令は一般的である。乗算の場合、zとzzは互いの桁が連続した値である。しかし加算の場合は、2つの入力値の絶対値がフォーマットの桁数以上離れている場合は、zとzzは互いの桁が連続した値とならない。図19(a)に、2つの入力値の絶対値がフォーマットの桁数以上離れている場合の加算演算の例を示す。この第1のケースにおいては、通常のフローで演算を行いzzを出力してもよいが、値の重なりが全くないことを利用すると、演算をしなくとも絶対値の小さい側をそのままzzとすることができ、zzを容易に出力することが可能である。
【0113】
また乗算の場合は、入力の符号は演算結果の仮数の値には影響しないため、zzを求める際に符号を考慮する必要がない。しかし加算の場合は、上記のように2つの入力値の絶対値が離れているとき、互いに異なる符号を有する2つの数の加算(同符号の数同士の減算)において特別な処理が必要である。図19(b)に、2つの入力値の絶対値が離れている場合における互いに異なる符号を有する2つの数の加算演算の例を示す。この第2のケースにおいては、通常のフローで演算を行うと、2つの入力の間のゼロで埋められていた桁に、図19(b)にAとして示すように、桁下がりによってゼロ以外の値が発生する。その結果、zzを表すために必要な精度が、離れた桁数分だけ増えてしまうことになる。従って、この第2のケースにおいては、通常のフローで演算を実行せずに、上記のケース1と同様の方法で絶対値の小さい側をそのままzzとして出力する必要がある。
【0114】
このように、加算におけるzz出力は、乗算の場合には考慮する必要のないケースを考慮しなければならない。従って、実際の回路構成を考える際には、例えばバイパス回路を追加する等の変更が必要となる点が、乗算におけるzz出力回路と異なる部分となる。
【0115】
図20は、get_zz演算を実現する回路の構成の一例を示す図である。図20の演算器は、図2の演算回路119の一部分に相当する。図20において、図15と同一又は対応する構成要素は同一又は対応する番号で参照する。図20に示す演算器は、入力Xレジスタ221、入力Yレジスタ222、内部形式変換回路223及び224、指数仮数演算回路225A、セレクタ226及び227、シフタ228及び229、指数加算器230、及び絶対値加算器231を含む。演算器は更に、セレクタ232及び233、正規化回路234、外部形式変換回路235、出力Zレジスタ236、及び正規化回路270を含む。
【0116】
内部形式変換回路223及び224により、入力を符号部、指数部、及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの符号、指数、仮数をそれぞれ符号X、指数X、仮数Xとする。入力Yの符号、指数、仮数をそれぞれ符号Y、指数Y、仮数Yとする。
【0117】
指数仮数演算回路225Aが、指数X及び指数Yと、仮数X及び仮数Yとを受け取る。指数仮数演算回路225Aは、指数Xと指数Yの大小比較をする。大小比較の結果に基づいて、指数仮数演算回路225Aは、指数の大きい側の仮数(第1の仮数)がシフタ228に入力され、且つ、指数の小さい側の仮数(第2の仮数)がシフタ229に入力されるように、セレクト信号を生成する。指数仮数演算回路225Aは、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、指数Xと指数Yとの差の絶対値の方が大きい場合は、第1の仮数の先行ゼロ計数値をシフタ228の左シフト量として出力する。指数Xと指数Yとの差の絶対値の方が小さい場合は、指数仮数演算回路225Aは、指数Xと指数Yとの差の絶対値をシフタ228の左シフト量として出力する。
【0118】
指数仮数演算回路225Aは、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し指数Xと指数Yとの差の絶対値の方が大きい場合は、指数Xと指数Yとの差の絶対値から第1の仮数の先行ゼロ計数値を減算した値をシフタ229の右シフト量として出力する。第1の仮数の先行ゼロ計数値の方が小さい場合は、指数仮数演算回路225Aは、ゼロをシフタ229の右シフト量として出力する。指数仮数演算回路225Aは更に、指数の小さい側に上述の右シフト量を加算した値を指数として出力する。
【0119】
指数仮数演算回路225Aは更に、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が14以上であるか否かを判定する。この絶対値が14以上である場合、指数仮数演算回路225は、第2の仮数とそれに対応する指数がセレクタ232及び233により選択されるように、セレクト信号を生成する。これにより、上記(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値がフォーマットの桁数である14以上である場合には、第2の仮数が、シフタ228及び絶対値加算器231をバイパスして、正規化回路234に入力されることになる。
【0120】
シフタ228は、入力されたシフト量に基づき、入力された仮数を左シフトする。シフタ229は、入力されたシフト量に基づき、入力された仮数を右シフトする。各シフタのシフト結果は絶対値加算器231に入力される。
【0121】
減算の場合は、片方の仮数が反転され、絶対値加算器231にキャリーが入力される。絶対値加算器231による加算の結果桁あふれが生じた場合は、1桁右にシフトした値が出力される。同時に、絶対値加算器231から指数加算器230にキャリーが送られ、指数に加算される。
【0122】
絶対値加算器231による加算の結果桁落ちが生じた場合は、1桁左にシフトした値が出力される。同時に、絶対値加算器231から指数加算器230に桁落ちを示す信号が送られ、指数から減算される。
【0123】
正規化回路270が、加算結果と指数演算結果とを受け取り、正規化された指数部と仮数部とを出力する。
【0124】
セレクタ232及び233は、指数仮数演算回路225によって生成されたセレクト信号に応じて、正規化された指数及び仮数、又は、第2の仮数及びそれに対応する指数を選択する。正規化回路234が、セレクタ232及び233により選択された指数及び仮数を受け取り、正規化演算結果を出力する。外部形式変換回路235は、正規化演算結果を外部形式に変換し、出力Zレジスタ236に出力する。
【0125】
図21は、get_zz演算の具体例を示す図である。図21において、入力Xの指数をEx、入力Yの指数をEy、入力Xの先行ゼロ計数値をLx、出力Zの指数をEzとする。この例において実行する演算は、図21に示すget_zz演算280である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうため、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。このためにEx−Eyを計算し、Lxと比較する。図21に示す具体例ではLxのほうが大きい。即ち、左シフト量Ex−Eyが先行ゼロの数内に収まるので、入力Xの仮数281のみ左シフトされる。入力Yの仮数282は右シフトされない。左シフト量はEx−Eyであり、右シフト量は0である。
【0126】
このようにして桁合わせされた数同士、即ち仮数281を左シフトして得られた仮数283と仮数282のままである仮数284とを加算する。更に、加算結果285を正規化し、先行ゼロ計数値が1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁左シフトが必要だが、指数が0から1となり奇数になるので、左シフト量は1減らされて0となり、指数は0のままである。
【0127】
次に、正規化結果の下位桁286を選択する。例えば入力フォーマットの仮数が14桁である場合は、最上位から14桁を上位桁、最上位から15桁目以降を下位桁とする。下位桁選択に伴い、指数は−14される。本具体例では、下位桁はゼロが選択される。
【0128】
更に、選択された下位桁287を正規化する。本具体例では対象データはゼロであるので、正規化前の仮数及び指数がそのまま正規化の結果として出力される。正規化された結果が、演算結果の仮数288及び対応する指数Ezを含む演算結果として出力される。
【0129】
図22は、get_zz演算の別の具体例を示す図である。この例において実行する演算は、図22に示す加算290である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうために不可能であるので、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。このためにEx−Eyを計算し、Lxと比較する。図22に示す具体例ではLxのほうが小さい。即ち、左シフト量Ex−Eyが先行ゼロの数内に収まらないので、入力Xの仮数291をLx分だけ左シフトし、左シフトしきれなかった分だけ入力Yの仮数292を右シフトする。即ち、左シフト量はLxであり、右シフト量は(Ex−Ey)−Lxである。
【0130】
このようにして桁合わせされた数同士、即ち仮数291を左シフトして得られた仮数293と仮数292を右シフトして得られた仮数294とを加算する。このとき、右シフトによって溢れた桁も保持する。
【0131】
更に、加算結果295を正規化し、先行ゼロ計数値が1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁右シフトが必要だが、指数が2から3となり奇数になるので、右シフト量は1増やされて4となり、指数は2から4となる。
【0132】
次に、正規化結果の下位桁296を選択する。例えば入力フォーマットの仮数が14桁である場合は、最上位から14桁を上位桁、最上位から15桁目以降を下位桁とする。下位桁選択に伴い、指数は−14される。
【0133】
更に、選択された下位桁297を正規化する。本具体例では、仮数は2桁左にシフトされ、指数は−10から2が減算されて−12となる。正規化された結果が、演算結果の仮数298及び対応する指数Ezを含む演算結果として出力される。
【0134】
図23は、get_zz演算の更に別の具体例を示す図である。この例において実行する演算は、図23に示すget_zz演算300である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうため、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。但し、桁合わせした結果、2つの入力の間に14桁以上の差がある場合、即ち、重なりが全くない場合には、実際に演算処理を実行しなくとも演算結果を求めることが可能である。get_zzは演算結果の下位側を求める演算であり、2入力の重なりがない場合には値の小さい側がそのまま下位側となるからである。
【0135】
この条件を満たすか否かを確認するため、(Ex−Lx)−(Ey−Ly)を計算し、計算結果が14以上の場合には上記の場合に該当すると判定する。ここで値14は、使用フォーマットにおける仮数の桁数である。この具体例では上記の場合に該当し、仮数301と仮数302との間に重なりが存在しない。この場合、仮数302がそのままバイパスされて加算結果として取り扱われる。
【0136】
更にバイパスされた結果303を正規化し、先行ゼロ計数値が1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁左シフトが必要だが、指数が0から−1となり奇数になるので、左シフト量は1減らされて0となり、指数は0のままとなる。このようにして得られた正規化の結果が、そのまま演算結果の仮数304及び対応する指数Ezを含む演算結果として出力される。
【0137】
図24は、two_sumの回路図シンボルを示す図である。上述したtwo_sumは、triple−oraclenum64計算において頻繁に用いられる演算である。このtwo_sum演算、即ちxとyとの正確な和を表現するzとzzとを求める演算を、図24に示すような演算子310で表わすものとする。
【0138】
図25は、triple−oraclenum64とoraclenum64の和を求める回路の一例を示す図である。図25に示す回路は、3つのtwo_sum演算子310と再正規化部311とを含む。入力bは1つのoraclenum64の数であり、入力a0,a1,a2はtriple−oraclenum64である。また出力s0,s1,s2もまたtriple−oraclenum64である。図25に示すような回路構成により、triple−oraclenum64とoraclenum64の和を求めることができる。なお再正規化部311が実行する演算については、後述する。
【0139】
図26は、triple−oraclenum64同士の和を求めるアルゴリズムを示す図である。前述のtwo−sumを用いて、triple−oraclenum64同士の和を求めることができる。図26に示すTriple_Addは、第1のtriple−oraclenum64であるa0,a1,a2と第2のtriple−oraclenum64であるb0,b1,b2との和を求める。この演算は、非特許文献2のA.2節に開示されているものと同様である。また非特許文献3に開示されるalgorithm13,14とも同様である。残りの四則演算についても、非特許文献1乃至3に開示の方法を用いて実現可能である。
【0140】
以下に、計算結果の再正規化について述べる。再正規化については、非特許文献2のp.116に述べられており、非特許文献3でもそれを参照している。ここでは、非特許文献2に記載される再正規化をPriestの再正規化と呼ぶ。再正規化前の演算結果(X0,X1,X2,X3)は、概ね絶対値の大きい順に並んでいるが、一般に、一部の桁にオーバーラップがある。また、X0がX0+X1+X2+X3の最重要(most significant)な部分を固定精度で表現した結果になっていない。
【0141】
計算結果(X0,X1,X2,X3)をPriestの方法で再正規化した結果を(a0,a1,a2)とすると、a0+a1+a2は、X0+X1+X2+X3とtripleの範囲で等しく、且つ、以下を満たす。
【0142】
|a0| ≧|a1| ≧ |a2|
E(i+1) ≦ Ei - 14
ここで、Eiは基数を10とした場合の要素aiの指数である。oraclenum64の精度は10進で14桁なので、上記の第2の条件は、要素がオーバーラップしていないことを表わす。
【0143】
Priestの再正規化にも、前述のtwo_sumが用いられる。まず、オーバーラップを除去するために、図27のように接続された3つのtwo_sum演算子310を用いる。これにより得られる(t0,t1,t2,t3)は、オーバーラップしておらず、且つ、0でない要素については絶対値の大きいものから順に並んでいる。これらをt0から順に蓄積していったものを(a0,a1,a2)とすればよい。この蓄積を行なう演算accumulateにもtwo_sumが用いられる。
【0144】
一般に再正規化前の演算結果(X0,X1,X2,X3)の符号は揃ってなく、前述のようにtwo_sumを繰り返した結果である(a0,a1,a2)の符号も揃っていない。そこでPriestの再正規化を行った固定精度浮動小数点数の組に含まれる数の符号が全て同符号な場合を、符号の揃ったPriestの再正規化と呼ぶ。
【0145】
本願では、Priestの再正規化よりも条件の厳しい「強い正規化」を用いる。強い正規化された組(b0,b1,b2)は、次の条件を満たす。なお強い正規化により、b1=0且つb2≠0となる場合が生じるため、|b0|>=|b1|>=|b2|の条件は一般に成り立たない。
【0146】
E(i+1) = Ei - 14
b0,b1,b2:全て同符号
このような強い正規化により、各要素の指数の差と固定小数点数の精度(桁数)とが一致する。従って、強い正規化された組を元のOracle−number表現に戻すことは容易である。
【0147】
まず図27で示されるオーバーラップが無く0以外の数は絶対値の大きいものから順に並んでいる数の組(t0,t1,t2,・・・)から、符号の揃ったPriestの再正規化された数の組(a0,a1,a2,・・・)を得るための処理を示す。ここでfl_truncate(X+Y)は、固定精度浮動小数点数XとYとの和を有効桁で切り捨てる演算を表し、two_sum(X,Y)は前述の通り有効桁に重なりの無い2数を求める演算とする。但しここではtwo_sum内での演算は全て四捨五入で丸め処理されるものとする。
【0148】
a0 = fl_truncate(t0+t1)
(z0,zz0) = two_sum(t0,t1)
zz0=0の場合、以下の様にzz0≠0となるまでt2,t3,・・・を順次accumulateしていく。
【0149】
a0 = fl_truncate(a0+t2)
(z0,zz0) = two_sum(a0,t2)
入力された数の組(t0,t1,t2,・・・)を全てaccumulateされてもzz0=0な場合はそこで処理を終了する。以下zz0≠0となった後の処理を示す。
【0150】
w0 = fl_truncate(z0 - a0)
ここで、two_sumの性質より、
t0+t1+...+ti = z0+zz0 = a0+w0+zz0
となる。但しt0,t1,・・・,tiはzz0≠0となるまでaccumulateされた数である。この時、以下の通りa0と(w0+zz0)は同符号であり、且つ、a0と(w0+zz0)に有効桁の重なりは無いと言える。
【0151】
(i)w0=0の場合:zz0はfl_truncate(t0+t1+...+ti)によって切り捨てられた数に等しいため、a0と(w0+zz0)は同符号であり、且つ、a0と(w0+zz0)に有効桁の重なりは無い。
【0152】
(ii)w0≠0の場合:w0はa0と同符号でa0の有効桁最下位にのみ1が立つ数であり、zz0の絶対値はw0の絶対値よりも小さくzz0とw0は異符号なため、a0と(w0+zz0)は同符号であり、且つ、a0と(w0+zz0)に有効桁の重なりは無い。
【0153】
次に、(w0,zz0,ti+1,...)に対して同様の処理を繰り返すことで、a1,a2,・・・を順次求めることができる。この際、上記(i),(ii)によりa1,a2,・・・は全て同符合となる。
【0154】
図28は、符号の揃ったPriestの再正規化の例を示す図である。この例においては、簡単のために固定精度浮動小数点数は10進4桁とし、two_sumでの丸め処理方法は四捨五入であるとする。図28において、(t0,t1,t2,t3)はオーバーラップしておらず、且つ、0でない要素については絶対値の大きいものから順に並んでいる。これらをt0から順に蓄積していくことで、符号の揃ったPriestの再正規化された数の組a0,a1,a2,a3が得られている。
【0155】
図29は、符号の揃ったPriestの再正規化された数の組から強い正規化された数の組を得る計算の一例を示す図である。強い正規化のためには、符号の揃ったPriestの再正規化された数の組から第2要素以降を適切に量子化してやればよい。図29に示す例では、簡単のために固定精度浮動小数点数は10進4桁としてある。図29に示されるように、符号の揃ったPriestの再正規化された数の組(a0,a1,a2)から強い正規化が行われた数の組(b0,b1,b2)が求められている。
【0156】
図30は、量子化のためのscale_next(X,Y)演算を実現する回路構成の一例を示す図である。図30に示す回路は、指数補正値レジスタ320、入力Xレジスタ321、入力Yレジスタ322、内部形式変換回路323及び324、指数加算器325、シフト量演算回路326、右シフタ327、外部形式変換回路328、及び出力Zレジスタ329を含む。この回路の入力データは以下の条件を満たしていることを前提としている。
【0157】
指数Y ≧ 指数X + t
ここでtはoraclenum64の桁数である。本実施例では、tは例えば14である。
【0158】
内部形式変換回路323及び324により、入力を指数部及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの指数及び仮数をそれぞれ指数X及び仮数Xとする。入力Yの指数を指数Yとする。指数補正値レジスタ320には、予め決められた固定値tが格納される。レジスタ格納値として設定するのではなく、ハード的に固定値を設定してもよい。
【0159】
シフト量演算回路326が指数Xと指数Yと固定値tを受け取る。シフト量演算回路326は、指数Y−指数X−tの演算結果をシフト量として出力する。右シフタ327は、このシフト量と仮数Xとを受け取り、仮数Xを当該シフト量だけ右シフトした結果を出力する。シフトアウトした桁は捨てられる。
【0160】
指数加算器325は、指数Yと固定値tとを受け取り、指数Y−tの演算結果を出力する。外部形式変換回路328は、指数加算器325からの指数と右シフタ327からの仮数を外部形式に変換し、出力Zレジスタ329に出力する。
【0161】
図31は、仮数部を内部形式に変換せずにscale_next演算を行う回路の構成の一例を示す図である。図31において、図30と同一の構成要素は同一の番号で参照し、その説明は適宜省略する。図31では、内部形式変換回路323の代りに内部形式変換回路323Aが設けられ、外部形式変換回路328の代りに外部形式変換回路328Aが設けられている。入力データがoraclenum64形式の場合、右シフタはシフト量2につき8ビットシフトする。
【0162】
内部形式変換回路323A及び324により、入力を指数部及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの指数を指数Xとする。入力Yの指数を指数Yとする。指数補正値レジスタ320には、予め決められた固定値tが格納される。レジスタ格納値として設定するのではなく、ハード的に固定値を設定してもよい。
【0163】
シフト量演算回路326が指数Xと指数Yと固定値tを受け取る。シフト量演算回路326は、指数Y−指数X−tの演算結果をシフト量として出力する。右シフタ327は、このシフト量と仮数Xとを受け取り、仮数Xを当該シフト量だけ右シフトした結果を出力する。シフトアウトした桁は捨てられる。
【0164】
指数加算器325は、指数Yと固定値tとを受け取り、指数Y−tの演算結果を出力する。外部形式変換回路328Aは、指数加算器325からの指数を外部形式に変換し、出力Zレジスタ329に出力する。また右シフタ327の出力する右シフト後の仮数は、そのまま出力Zレジスタ329に出力される。
【0165】
以下に、triple−oraclenum64形式に対する丸め処理を考える。ここでは、丸め処理対象であるtriple−oraclenum64形式の数の組(a0,a1,a2)は再正規化されていることを前提とする。なおこの前提条件は、Priestの再正規化及び強い正規化の何れであってもよい。
【0166】
図32は、Oracle−Database(商標)におけるNUMBER型の3種類の精度指定方法を示す表である。ここで、丸め方向は常に四捨五入である。例えば、計算結果が 1234.56だった場合に、NUMBER(4)、NUMBER(4,−2)、NUMBER(4,1)のそれぞれの指定に対する丸め結果は、以下の通りとなる。
【0167】
NUMBER(4)→1234
NUMBER(4,−2)→1200
NUMBER(4,1)→エラー
最後の例でエラーとなるのは、計算結果である1234.56を小数点1位まで表わすように丸めた結果である1234.6が、4桁の精度内に収まらないためである。
【0168】
triple−oraclenum64形式においても、このような丸め処理を、エラー判定も含めて効率良く実現する必要がある。ここで用いることのできる演算器は、8バイト幅のオペランドを2つの入力として、1つの8バイト幅の数を出力する演算器である。丸め処理においても、このような演算器を前提とする。
【0169】
そこで、triple−oraclenum64で表現された数の丸め処理を、以下の3ステップで実現することにする。
【0170】
1)四捨五入が発生する桁位置のみ5があるような数を生成する。
【0171】
2)triple−oraclenum64形式の数に、上で生成した数を加える。
【0172】
3)適切な桁位置で切捨てを行う。
まず、第1ステップのアルゴリズムについて述べる。以降、丸め対象数のtriple−oraclenum64表現を(a0,a1,a2)とする。また、この組の最重要要素a0の値は、
a0 = M * 100^e
で表わされるとする。また、上式のeを求めるための演算をe(a0)と表すことにする。
【0173】
第1ステップは、精度指定方法により、生成アルゴリズムが異なる。精度指定がない場合(引数なしのNUMBER指定の場合)には、仮数部が20バイト以下となるように丸めが行われる必要がある。
【0174】
精度指定時のアルゴリズムを記述するには、a0を10進表記で表した方が都合がよい。そこで、
a0 = M' * 10^e'
の形で表す。また、仮数部が10>|M'|>=0を満たすように正規化されているものとする。また、前と同様に、e'を求めるための演算をe'(a0)と表す。
【0175】
図33は、四捨五入が発生する桁位置のみ5があるような数を生成するアルゴリズムの例を示す図である。図33(a)及び(b)には、10進桁数による精度指定の場合のアルゴリズムが示される。これら2つのアルゴリズムは、いずれも2入力1出力型の演算器として実現可能である。図33(c)には、スケール(小数点からの相対位置)指定の場合のアルゴリズムが示される。小数点からの相対位置を指定するので、a0に依存しない計算となる。この図33(c)に示すアルゴリズムは、図示した通りの数式をそのままプログラム化してもよいが、nの各値に対応するテーブルを用意しておいて、nをキーにテーブルを引くようなプログラムを用意してもよい。
【0176】
スケール指定があった場合に、丸めた結果が指定精度に収まるか否かは、以下のように判定できる。NUMBER(p,s)が指定された場合、まず、上述の精度指定の場合のアルゴリズムとスケール指定のアルゴリズムとを両方用いて、p_d及びp_sの2つの値を計算する。
【0177】
p_d = get_comma5(a0, digits=p)
p_s = get_comma5(scale=s)
このとき、|p_d|>|p_s|となった場合、すなわちp_dの絶対値がp_sの絶対値よりも大きい場合には、スケール指定で丸められた結果を表現するためには、精度が不足していることがわかる。
【0178】
次に第2ステップでは、第1ステップで生成した数を、triple−oraclenum64で表現された数に加える。この加算には、図25に示したアルゴリズムが利用できる。
【0179】
第3ステップでは、適切な位置で切り捨てを行う。ここでも、第1ステップで生成した数p(精度指定の方式に応じたp_dまたはp_sの何れかの値)を利用することができる。この数pは、四捨五入のために加算される数であり、丸めが発生する桁位置に関する情報を完全に含んでいる。そのため、triple−oraclenum64の各要素とpとの2つのオペランドを入力として、各要素を適切にtruncateする演算を定義することができる。
【0180】
第2ステップの計算結果を(b0,b1,b2)とすると、丸めの第3段階の結果(c0,c1,c2)は、
c0 = truncate(b0, p)
c1 = truncate(b1, p)
c2 = truncate(b2, p)
となる。
【0181】
図34は、get_comma5(precision)を実現する回路構成の一例を示す図である。図34に示す回路は、精度pレジスタ330、入力Xレジスタ331、内部形式変換回路332、先行ゼロ計数回路333、指数加算器334、レジスタ335及び336、セレクタ337、外部形式変換回路338、及び出力Zレジスタ339を含む。
【0182】
内部形式変換回路332により、入力を指数部及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの指数と仮数をそれぞれ指数X、仮数Xとする。先行ゼロ計数回路333は、仮数Xを受け取り、仮数X中の先行ゼロの数を計数する。指数加算器334は、指数X+1−精度p−仮数Xの先行ゼロ計数値を計算する。セレクタ337は、指数加算器334の出力が奇数の場合にはレジスタ336の5000−00を選択し、指数加算器334の出力が偶数の場合にはレジスタ335の0500−00を選択する。
【0183】
指数加算器334から外部形式変換回路338へ供給される指数は、指数加算器334の出力が奇数の場合は当該指数の最下位ビットをゼロとし、指数加算器334の出力が偶数の場合はそのままとする。外部形式変換回路338は、内部形式変換回路332からの符号、指数加算器334からの指数、及びセレクタ337からの仮数を外部形式の数に変換して、変換結果を出力Zレジスタ339に出力する。
【0184】
図35は、truncate演算を実現する回路構成の一例を示す図である。図35の回路は、入力Xレジスタ340、comma5レジスタ341、内部形式変換回路342及び343、先行ゼロ計数回路344、マスク値生成回路345、マスク回路346、外部形式変換回路347、及び出力Zレジスタ348を含む。
【0185】
内部形式変換回路342及び343により、入力を符号、指数部、及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの符号、指数、及び仮数をそれぞれ符号X、指数X、及び仮数Xとする。入力comma5の指数と仮数をそれぞれ指数c及び仮数cとする。
【0186】
先行ゼロ計数回路344は、仮数cを受け取り、仮数c中の先行ゼロの数を計数する。マスク値生成回路345は、指数X、指数c、及び仮数cの先行ゼロ計数値を入力として受け取り、これらの入力に応じてマスクデータを生成する。マスク回路346は、仮数Xをマスクデータに応じてマスクし、マスク後の値を仮数として出力する。外部形式変換回路347は、内部形式変換回路342からの符号X及び指数X並びにマスク回路346からの仮数を外部形式の数に変換して、変換結果を出力Zレジスタ348に出力する。
【0187】
図36は、マスク値生成回路の構成の一例を示す図である。図36に示すマスク値生成回路345は、マスク桁演算回路350、デコーダ351、及びセレクタ352−1乃至352−14を含む。マスク桁演算回路350は、指数X、指数c、及び先行ゼロ計数値Lcを受け取り、マスク桁を演算する。マスク桁は、使用フォーマットの仮数の桁数を14とすると、14+(指数c−Lc)−指数Xで求められる。この値は、マスクデータの最下位桁から何桁目までがゼロに設定されるかを示す。このように計算されたマスク桁演算結果に基づいて、デコーダ351が、桁ごとのセレクト信号を生成する。デコーダ351が生成したセレクト信号は、14桁にそれぞれ対応するセレクタ352−1乃至352−14に供給される。マスク桁演算結果がnの場合、下位からn桁は0000側を選択するようにセレクト信号が生成される。マスク桁演算結果が0の場合は、全ての桁が1111側を選択するようにセレクト信号が生成される。このセレクト信号に応じて、セレクタ352−1乃至352−14が、1111又は0000の何れかのビット列を選択し、選択したビット列をマスクデータとして出力する。
【0188】
図37は、p_d及びp_sの絶対値大小比較エラー判定回路の構成の一例を示す図である。この回路は、p_sレジスタ360、p_dレジスタ361、内部形式変換回路362及び363、指数仮数演算回路364、セレクタ365及び366、シフタ367及び368、符号演算器369、加算器370、コンプリメンタ372、コンプリメンタ373、及びエラーフラグレジスタ371を含む。
【0189】
内部形式変換回路362及び363により、入力を指数部、及び仮数部に分割し、入力の値表現を内部形式に変換する。入力p_sの指数、仮数をそれぞれ指数X、仮数Xとする。入力p_dの指数、仮数をそれぞれ指数Y、仮数Yとする。
【0190】
指数仮数演算回路364が、指数X及び指数Yと、仮数X及び仮数Yとを受け取る。指数仮数演算回路364は、指数Xと指数Yの大小比較をする。大小比較の結果に基づいて、指数仮数演算回路364は、指数の大きい側の仮数(第1の仮数)がシフタ367に入力され、且つ、指数の小さい側の仮数(第2の仮数)がシフタ368に入力されるように、セレクト信号を生成する。指数仮数演算回路364は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、前者の方が大きい場合は、後者をシフタ367の左シフト量として出力する。前者の方が小さい場合は、指数仮数演算回路364は、前者をシフタ367の左シフト量として出力する。
【0191】
指数仮数演算回路364は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、前者の方が大きい場合は、前者から後者を減算した値をシフタ368の右シフト量として出力する。前者の方が小さい場合は、指数仮数演算回路364は、ゼロをシフタ368の右シフト量として出力する。
【0192】
シフタ367は、入力されたシフト量に基づき、入力された仮数を左シフトする。シフタ368は、入力されたシフト量に基づき、入力された仮数を右シフトする。各シフタのシフト結果はコンプリメンタ372、コンプリメンタ373に入力される。
【0193】
コンプリメンタ372は入力された前述のセレクト信号が反転された信号により入力された左シフトの出力をコンプリメントするEOR回路(排他的論理和回路)である。コンプリメンタ373は入力された前述のセレクト信号により入力された右シフトの出力をコンプリメントするEOR回路(排他的論理和回路)である。各コンプリメンタの結果は加算器370に入力される。
【0194】
加算器370にキャリーが入力される。加算器370による加算の結果桁あふれが生じた場合は、符号演算器369にキャリーアウトが供給される。
【0195】
符号演算器369は、加算器370からキャリーアウトを受け取る。符号演算器369は、キャリーアウトの反転値が1であるとき、エラーフラグを1にする。それ以外の場合において、エラーフラグは0である。符号演算器369が生成するエラーフラグは、エラーフラグレジスタ371に格納される。
【0196】
図38は、上記の符号演算器の回路構成の一例を示す図である。図38(a)に示す符号演算器は、インバータ380を含む。この回路により、キャリーアウトの反転値が1のとき、エラーフラグが1になる。図38(b)に示す表は、p_dとp_sの絶対値大小比較エラー判定回路に入力されたp_dとp_sの絶対値の大小関係と、その場合に出力される各信号の対応表である。ここで|p_d|はp_dの絶対値である。p_sについても同様である。
【0197】
図39は、Oracle−numberの長さを求める演算の一例を示す図である。前述の演算の結果として得られたtriple−oracelnum64形式の数を、1つのOracle−numberとしてメモリに書き込む際には、このOracle−numberの長さを求める必要がある。Oracle−numberの長さを求めるには、図39に示されるようにすればよい。但し、length(aX)は、oraclenum64形式での有効桁数を求める演算とする。a2が0であればOracle−numberの長さは短くなるし、更にa1が0であればOracle−numberの長さは更に短くなる。
【0198】
強い再正規化を施したtriple−oracelnum64形式において、a0、a1、a2は、1つのOracle−numberの仮数部を7バイト、7バイト、6バイトの3つの部分に分割した各部を表現している。従って、基本的には、a0、a1、a2の仮数部を連結するだけで、Oracle−number表現が得られる。但し、a0、a1の長さが短い場合には、後続ゼロを拡張してからメモリに格納する必要がある。
【0199】
図40は、expand演算を実現する回路の構成の一例を示す図である。図40の回路は、入力Xレジスタ390、内部形式変換回路391、後続ゼロ計数回路392、桁セレクト演算回路393、及び出力Zレジスタ394を含む。
【0200】
内部形式変換回路391は、入力Xレジスタ390の格納値の仮数部を受け取り、内部形式の仮数部を出力する。後続ゼロ計数回路392は、内部形式の仮数部を受け取り、受け取った仮数部から後続ゼロの数を求め、後続ゼロの計数結果を基にした桁セレクトデータを出力する。桁セレクト演算回路393は、入力Xレジスタ390から格納値の符号部と仮数部とを受け取り、更に後続ゼロ計数回路392から桁セレクトデータを受け取る。符号と桁セレクトデータとに基づいて、桁セレクト演算回路393は、受け取った仮数又はoraclenum64のゼロ(0x01または0x65)の何れかを桁毎に選択して出力する。後続ゼロ計数回路392において後続ゼロの部分であると判断された桁においては、ゼロが選択されて出力される。出力されたデータは出力Zレジスタ394に格納される。
【0201】
図41は、上記の後続ゼロ計数回路の構成の一例を示す図である。図41(a)に示すように、後続ゼロ計数回路は、変換回路400を含む。変換回路400は仮数を入力データとして受け取り、図41(b)に示すテーブルに従い入力データから出力データを生成する。この出力データが後続ゼロ計数値であり、2進数により計数値が表わされる。テーブルでは、一番右側のXはゼロ以外の値を表し、それ以外のXはドントケアである。0は計数対象となるゼロを表わす。
【0202】
図42は、桁セレクト演算回路の構成の一例を示す図である。図42に示す桁セレクト演算回路393は、デコーダ410及びセレクタ411−1乃至411−14を含む。デコーダ410は、符号と後続ゼロ計数値とを受け取り、桁毎の選択信号である桁セレクト信号を生成する。デコーダ410が生成した桁セレクト信号は、例えば14桁にそれぞれ対応するセレクタ411−1乃至411−14に供給される。後続ゼロ計数値がnの場合、下位からn桁は0x01又は0x65側を選択するように桁セレクト信号が生成される。このとき、符号が正を表す1のときは0x01が選択され、符号が負を表す0のときは0x65が選択される。下位より数えてn+1桁から上位の桁は、入力の仮数がそのまま選択される。このようにして桁毎に選択された入力仮数、0x01、又は0x65が、仮数データとして出力される。
【0203】
図43は、固定精度浮動小数点加減算器の構成の一例を示す図である。図43に示す固定精度浮動小数点加減算器は、図5に示す固定精度浮動小数点加減算器に対して、ここまでに説明した種々の演算の機能を纏めて付加することにより得られる回路であり、図2の演算回路119の一部分に相当する。ここで付加される種々の演算は、図15のget_z演算、図20のget_zz演算、図30のscale_next演算、図34のget_comma5演算、図35のtruncate演算、図37のエラー判定、及び図40のexpand演算を含む。図43に示す固定精度浮動小数点加減算器は、値レジスタ450、入力Xレジスタ451、入力Yレジスタ452、内部形式変換回路453及び454、後続ゼロ計数回路455、指数仮数マスク演算回路456、セレクタ457及び458を含む。図43に示す固定精度浮動小数点加減算器は、更に、シフタ459及び460、桁セレクト演算回路461、マスク回路462、符号指数演算回路463、絶対値加算器464、正規化回路465、セレクタ466乃至468、正規化回路469を含む。図43に示す固定精度浮動小数点加減算器は、更に、セレクタ470及び471、丸め回路472、外部形式変換回路473、セレクタ474及び475、エラーフラグレジスタ476、及び出力Zレジスタ477を含む。
【0204】
図43に示す固定精度浮動小数点加減算器の各部は、前述の演算回路の対応する各部に相当する。例えば、後続ゼロ計数回路455及び桁セレクト演算回路461は、図40のexpand演算の後続ゼロ計数回路392及び桁セレクト演算回路393に相当する。また例えばマスク回路462は、図35のtrundate演算のマスク回路346に相当する。また例えば正規化回路465は、図20のget_zz演算の正規化回路270に相当する。例えば正規化回路469は、図15のget_z演算及び図20のget_zz演算の正規化回路234に相当する。また例えばセレクタ468は、図34のget_comma5演算のセレクタ337に相当する。また指数仮数マスク演算回路456及び符号指数演算回路463は、各演算回路の対応する回路部を纏めたものに相当する。これら回路部分の動作については、前述の各演算回路の対応する回路部分の動作と同様である。なお丸め回路472を通す必要のない演算もあるが、セレクタの数を削減するために、この構成例では全ての演算結果を丸め回路472に通す形態としている。丸め処理の必要がない演算については、丸めモードを強制的にゼロ方向に設定することで、丸め回路472を通さなかった場合と同等の結果を得ることができる。
【0205】
図44は、指数仮数マスク演算回路の構成の一例を示す図である。図44に示す指数仮数マスク演算回路456は、比較回路480、絶対値加算器481、セレクタ482乃至486、先行ゼロ計数回路487及び488、加算器491及び492、及びマスク生成回路493を含む。図44に示す指数仮数マスク演算回路456は更に、セレクタ494乃至496、及び加算器497を含む。
【0206】
比較回路480、絶対値加算器481、先行ゼロ計数回路487、セレクタ494及び496、及び加算器492は、図6に示す比較回路151、絶対値加算器152、先行ゼロ計数回路156、セレクタ158及び157、及び加算器155に相当する。但し、絶対値加算器481は、指数X及び指数Yに加え、各演算機能に応じた値を受け取り、所定の加減算を実行する。絶対値加算器481は、get_z演算やget_zz演算の場合には、指数Xと指数Yの差の絶対値を計算する。また例えばscale_next演算の場合であれば、絶対値加算器481は、指数Y−指数X−t(oraclenum64の桁数)の演算結果をシフト量として出力する。また加算器491は、図36のマスク桁演算回路350の機能を実現し、指数X、指数c(comma5の指数)、及び先行ゼロ計数値Lcを受け取り、マスク桁を演算する。マスク生成回路493は、図36のデコーダ351及びセレクタ352−1乃至352−14に相当し、上記マスク桁に応じてマスクデータを生成する。また加算器491は更に、図15及び図20の指数仮数演算回路の機能を実現し、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が14以上であるか否かを判定する。この絶対値が14以上である場合、加算器491は、バイパス経路を選択するためのバイパスセレクト信号を生成する。
【0207】
以上、本発明を実施例に基づいて説明したが、本発明は上記実施例に限定されるものではなく、特許請求の範囲に記載の範囲内で様々な変形が可能である。
【符号の説明】
【0208】
110 プロセッサ
111 メモリ
112 2次キャッシュ部
113 1次キャッシュ部
114 制御部
115 演算部
116 レジスタ
117 演算制御部
118 演算器
119 演算回路
【技術分野】
【0001】
本願開示は、演算回路、演算処理装置、及び演算回路の制御方法に関する。
【背景技術】
【0002】
銀行等において勘定処理を行なう勘定系や、一部の科学技術計算などでは、数値表現や演算における誤差を小さくするために、多倍長、または、可変長の数値表現形式が採用されることがある。このような場合、符号と指数とをひとつの整数で表現し、仮数については、ひとつの整数で表現した符号と指数とは別の整数の列で表現することが多い。また、このような数値表現を採用した場合には、整数演算を利用して数値同士の計算が実現されることも多くあった。
【0003】
それに対し、多倍長や可変長の浮動小数点演算を、固定精度の浮動小数点演算を用いて実現する方法が提案されている。固定精度の浮動小数点演算については、ハードウエアによる処理手段を提供している場合が多いため、そのようなハードウエア処理手段を用いることで、全ての処理をソフトウェアに行なわせる場合よりも処理の高速化をはかることができる。例えば、多倍長の2進浮動小数点演算を、2倍長の浮動小数点演算を用いて行うライブラリも存在する。
【0004】
これらの方法では、固定精度浮動小数点数の組(要素同士の足し算を実行せずに組のまま用いることから「未評価の和」とも呼ばれる)によりひとつの数を表現し、その組同士の算術を適切に実行することで、大きな精度の算術(四則演算)を実現している。更に、このように大きな精度の範囲で正確な算術を実現することに加え、現実のソフトウエアでは、精度に関して、丸め演算も実行される。例えば、ある種のデータベースにおいては、数値型に関して精度指定とスケール指定との2通りの方法で丸め位置を指定できる。このようなソフトウエアの高速化のためには、演算を高速に処理するだけでなく、丸め処理も効率良く行う必要がある。
【先行技術文献】
【非特許文献】
【0005】
【非特許文献1】T. Dekker, A Floating-Point Technique for Extending the Available Precision, Numer. Math. vol. 18, pp.224-242, 1971.
【非特許文献2】D. Priest, Appendix A: Algorithms for Arbitrary Precision Floating Point Arithmetic, pp.111-124, On Property of Floating Point Arithmetics: Numerical Stability and the Cost of Accurate Computations, PhD thesis, University of California, Berkeley, November 1992.
【非特許文献3】Yozo Hida, Xiaoye S. Li, David H. Bailey, Library for Double-Double and Quad-Double Arithmetic, 29 December 2007.
【発明の概要】
【発明が解決しようとする課題】
【0006】
以上を鑑みると、固定精度浮動小数点数の組を丸め対象とした場合に、丸め演算を効率的に実現する演算方式が望まれる。
【課題を解決するための手段】
【0007】
丸め対象データの丸めを行なう演算回路は、N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタと、前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数する第1の先行ゼロ計数部と、前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出する指数生成部と、前記指数生成部が生成した丸め指数部と、丸めを行う桁に加算される丸め加算値を保持する第1の出力レジスタを有することを特徴とする。
【0008】
丸め対象データの丸めを行なう演算回路と、前記演算回路の演算結果を丸める場合の丸め前処理を制御する丸め前処理命令をデコードする命令制御部とを有する演算処理装置において、前記演算回路は、N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタと、前記命令制御部による前記丸め前処理命令のデコード結果に基づき、前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数する第1の先行ゼロ計数部と、前記命令制御部による前記丸め前処理命令のデコード結果に基づき、前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出する指数生成部と、前記指数生成部が生成した丸め指数部と、丸めを行う桁に加算される丸め加算値を保持する第1の出力レジスタを有することを特徴とする。
【0009】
N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタとを有する丸め対象データの丸めを行なう演算回路の制御方法は、前記演算回路が有する第1の先行ゼロ計数部が、前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数し、前記演算回路が有する指数生成部が、前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出して丸めを行う桁に加算される丸め加算値を出力することを特徴とする。
【発明の効果】
【0010】
本願開示の少なくとも1つの実施例によれば、固定精度浮動小数点数の組を丸め対象とした場合に、丸め演算を効率的に実現する演算方式が提供される。
【図面の簡単な説明】
【0011】
【図1】Oracle−numberの具体例の表を示す図である。
【図2】コンピュータシステムの構成の一例を示す図である。
【図3】oraclenum64の構成を示す図である。
【図4】長さが9バイトのoraclenum64の構成を示す図である。
【図5】oraclenum64を直接演算対象とできる演算器の構成の一例である。
【図6】指数仮数演算回路の構成の一例を示す図である。
【図7】正規化回路の構成の一例を示す図である。
【図8】先行ゼロ計数回路の構成の一例を示す図である。
【図9】内部形式変換回路の構成の一例を示す図である。
【図10】外部形式変換回路の構成の一例を示す図である。
【図11】固定精度浮動小数点数加算の具体例を示す図である。
【図12】固定精度浮動小数点数加算の別の具体例を示す図である。
【図13】21バイト長のOracle−numberを3つの部分に分ける方法を示す図である。
【図14】分割された3つの仮数部にそれぞれ対応するoraclenum64数を生成する方法を示す図である。
【図15】get_z演算を実現する回路の構成の一例を示す図である。
【図16】get_z演算の具体例を示す図である。
【図17】get_z演算の別の具体例を示す図である。
【図18】get_z演算の更に別の具体例を示す図である。
【図19】2つの入力値の絶対値がフォーマットの桁数以上離れている場合の加算演算の例を示す図である。
【図20】get_zz演算を実現する回路の構成の一例を示す図である。
【図21】get_zz演算の具体例を示す図である。
【図22】get_zz演算の別の具体例を示す図である。
【図23】get_zz演算の更に別の具体例を示す図である。
【図24】two_sumの回路図シンボルを示す図である。
【図25】triple−oraclenum64とoraclenum64の和を求める回路の一例を示す図である。
【図26】triple−oraclenum64同士の和を求めるアルゴリズムを示す図である。
【図27】オーバーラップを除去するための3つのtwo_sum演算子の接続を示す図である。
【図28】符号の揃ったPriestの再正規化の例を示す図である。
【図29】符号の揃ったPriestの再正規化された数の組から強い正規化された数の組を得る計算の一例を示す図である。
【図30】量子化のためのscale_next(X,Y)演算を実現する回路構成の一例を示す図である。
【図31】仮数部を内部形式に変換せずにscale_next演算を行う回路の構成の一例を示す図である。
【図32】Oracle−DatabaseにおけるNUMBER型の3種類の精度指定方法を示す表である。
【図33】四捨五入が発生する桁位置のみ5があるような数を生成するアルゴリズムの例を示す図である。
【図34】get_comma5演算を実現する回路構成の一例を示す図である。
【図35】truncate演算を実現する回路構成の一例を示す図である。
【図36】マスク値生成回路の構成の一例を示す図である。
【図37】p_d及びp_sの絶対値大小比較エラー判定回路の構成の一例を示す図である。
【図38】符号演算器の回路構成の一例を示す図である。
【図39】Oracle−numberの長さを求める演算の一例を示す図である。
【図40】expand演算を実現する回路の構成の一例を示す図である。
【図41】後続ゼロ計数回路の構成の一例を示す図である。
【図42】桁セレクト演算回路の構成の一例を示す図である。
【図43】固定精度浮動小数点加減算器の構成の一例を示す図である。
【図44】指数仮数マスク演算回路の構成の一例を示す図である。
【発明を実施するための形態】
【0012】
まず、固定精度の浮動小数点数の組を用いて多倍長や可変長の浮動小数点演算を行う場合における丸め演算の問題を考える。多倍長の浮動小数点は、符号と指数を含む1つの整数である第1バイト、及び、仮数部を示す整数列である第2乃至第Nバイト(Nは3以上の整数)とを含む。仮数部のバイト数が任意の数であってよい表現形式であれば、多倍長でありながら且つ可変長である浮動小数点の数が得られることになる。多倍長や可変長の浮動小数点の具体的な表現形式としては、BCD(Binary Coded-Decimal:2進化10進数)やOracle−Database(商標)形式など様々な形式があり得る。多倍長浮動小数点数の演算を、固定精度浮動小数点演算を用いて実現するには、多倍長の数を複数の部分に分割し、固定精度浮動小数点数の組で表現する。このためには、表現したい多倍長浮動小数点数の仮数部を、固定精度浮動小数点数の仮数部桁数に等しいt桁を含む複数の部分に分割し、各部をそれぞれ一つの固定精度浮動小数点数として表現する。その際、各部の指数部をtずつ減じることにより、仮数部がt桁ずつずれている分を、それぞれの固定精度浮動小数点数に反映させる。
【0013】
上述のような固定精度の浮動小数点数の組を用いて加減算等の算術演算を行なうことは、非特許文献1乃至3等にも開示されており、計算方法が確立されている。しかし、ユーザ指定により任意の桁位置で丸める方法については、別途考える必要がある。
【0014】
一例としてOracle−Database(商標)におけるNUMBER型の3種類の精度指定方法を用いて、丸め演算について説明する。図32は、このNUMBER型の3種類の精度指定方法を示す表である。
【0015】
図32の表の1番目に示す精度指定なしの場合には、NUMBER型の最大精度となるように演算結果が丸められる。従って、演算においては、NUMBER型の最大精度よりも少なくとも一桁多い内部精度が必要となる。
【0016】
表の2番目に示す桁数による精度指定の場合には、ユーザ指定の桁数となるように演算結果が丸められる。表の3番目に示す桁数とスケール指定による丸め位置指定の場合には、スケールにより決まる丸め位置において丸められた結果が、指定された桁数に収まるように、丸め演算の結果を生成する。丸め演算結果の値が、指定スケールでは指定精度の桁数に収まらない場合には、エラーとなる。また、桁数による精度指定の場合に1の位以上に不正確な結果が出た場合もエラーとなる。
【0017】
これらの全ての指定方法について、効率のよい丸め演算を実現することを考える。また上記のエラーが発生する場合について、エラー発生を素早く判定する方法が必要となる。なお丸め方向としては、四捨五入(Nearest, ties away from 0)を考慮対象とする。
【0018】
ここで、前述のような固定精度の浮動小数点数の組を用いて多倍長や可変長の浮動小数点演算を行う場合における丸めの問題を考えているので、丸め演算を1命令で実現するような演算器を想定することはできない。何故なら演算器の入出力は、固定精度の浮動小数点数の組の内の1つの固定精度の浮動小数点に対応するからである。固定精度の浮動小数点数の組の演算を前提に、丸め演算を適切に実行する。
【0019】
そこで、丸め処理(ここでは丸めモードとして四捨五入のみ考える)を、以下の3つの段階に分解して考える。
【0020】
1)四捨五入が発生する桁位置のみβ/2があるような数を生成する(βは基数:基数が10の場合はβ/2=5)。
【0021】
2)固定精度浮動小数点数の組に、上で生成した数を加える。
【0022】
3)適切な桁位置で切捨てを行う。
これら3つの段階のうち、第2段階の加算演算については、例えば非特許文献1乃至3に記載されるような固定精度浮動小数点数の組に対する算術を用いればよい。ここでは、第1段階及び第3段階の演算を行う専用の命令を用意する方法を考える。
【0023】
スケール指定がある場合については、第1段階の処理は、丸め対象の数には依存せず、スケール指定のみによって決まる。例えば、「小数点第1位まで」と指定された場合には、丸め対象の数に関わらず、加えるべき数は0.05(基数が10の場合)である。
【0024】
それに対し精度指定の場合には、加えるべき数は、丸め対象の数値に依存する。例えば、4桁精度に丸める場合、丸め対象が1.23456のときには、四捨五入のために加えられるべき数字は0.0005である。1.23456+0.0005=1.23506となり、この加算結果の4桁目より後ろを切り捨てることにより、1.235が得られる。しかし例えば丸め対象が12.3456なら、加えるべき値は0.005となる。
【0025】
このように丸め対象の値に依存する第1段階の処理を、正規化された固定精度の浮動小数点数の組に対して実行する場合、組の要素のうちの最重要部(most significant part)の1要素の値と指定精度との2つの入力を用いればよい。そしてこれら2つの入力に基づいて、適切な桁位置にのみβ/2(例えば5)があるような数p_dを生成する以下のget_comma5命令を用意すればよい。
【0026】
p_d = get_comma5(a0, digits=n)
ここで、a0は、固定精度の浮動小数点数の組の最重要部(最上位桁部分)であり、nは丸め後の桁数の指定である。後述の実施例で詳細に説明するように、この処理を行う命令を用意し、1命令でこの処理が実現できるようなハードウエアを用意する。
【0027】
第3段階についても、固定精度の浮動小数点数演算器によるアシスト命令を用意する。上記の第1段階で生成した数値p_dは、四捨五入のために加算されるべき数であると同時に、丸め位置についても完全な情報を含んでいる。そこで、この数により指定された位置で切捨てを実行する命令を用意すればよい。
【0028】
この命令を用いると、浮動小数点の組(a0,a1,a2,・・・)で表現された数(第2段階の加算を実行後の数)の丸め演算は、次のように実現される:
rounded_value = Σ truncate(a_i, p_d)
スケール指定による丸め演算の場合には、加算すべき数p_sは、丸め対象の数によらずスケール指定の値s(桁位置の指定値)を入力とする命令により、以下のように求めることができる。
【0029】
p_s = get_comma5(scale=s)
このp_sを用いて、四捨五入のための加算演算及びtruncateを実行すれば、スケール指定時の丸め演算も、精度指定の場合の丸め演算と同様に実現できる。
【0030】
またスケール指定があった場合に、丸めた結果が指定精度に収まるか否かは、以下のように判定できる。まず、上述の精度指定の場合のアルゴリズムとスケール指定のアルゴリズムとを両方用いて、p_d及びp_sの2つの値を計算する。
【0031】
p_d = get_comma5(a0, digits=n)
p_s = get_comma5(scale=s)
このとき、|p_d|>|p_s|となった場合、すなわちp_dの絶対値がp_sの絶対値よりも大きい場合には、スケール指定で丸められた結果を表現するためには、精度が不足していることがわかる。精度が不足している場合には、丸め処理を実施せずにエラーを報告すればよい。
【0032】
以下に、本発明の実施例を添付の図面を用いて詳細に説明する。なお各図面において、同一又は対応する構成要素は同一又は対応する名称又は番号で参照し、その説明は適宜省略する。
【0033】
以下に説明する実施例では、オラクルデータベース(商標)で用いられる数値型であるOracle−number(商標)を数値表現の一例として用い、これを高速に計算するハードウエアが提供される。まず、Oracle−numberの表現形式について述べる。ここで述べる事柄は、オラクルデータベースのSQLインタプリタ(Structured Query Language interpreter)上で確認することができる。
【0034】
Oracle−numberは、最大21バイトの可変長データ形式である。第1バイトに符号及び指数が格納され、後続バイトに仮数が格納される。仮数部は最大で20バイトである。
【0035】
Oracle−numberは、10進浮動小数点数を表現するためのデータ形式である。主にメモリ使用効率上の理由から、仮数部は、1バイトあたり10進2桁分のデータを保持する。またそれにあわせて、指数部は、基数100に対する指数が格納される。Oracle−numberで表現される数は、以下の形式で表すことができる。
【0036】
number = ± (M00 . M01 M02 ...) * 100^(exp)
ここでM00、M01、M02、・・・は、最大20バイトで表現される仮数部における第1バイト、第2バイト、第3バイト、・・・の各バイトの格納データを示す。仮数部は10進2桁毎に区切られているため、100進20桁とみなすこともできる。Oracle−numberは、この100進表現でみなしたときに必ず正規化されており、M00部(仮数部第1バイト)が0になることはない。
【0037】
Oracle−number表現の第1バイト(全体の第1バイト)は、符号及び指数部であり、次のように符号化される。
【0038】
number > 0 の場合:第1バイト = exp + 193
number == 0 の場合:第1バイト = 128
それ以外の場合:第1バイト = 62 - exp
第2バイト以降の仮数部は、バイト毎にM00、M01、・・・を保持する。各バイトにおいては、表現する数値の符号に応じて、以下に示すように異なった符号化がもちいられる。
【0039】
number > 0 の場合:仮数部の第nバイト = M(n-1) + 1
number == 0 の場合:仮数部はない
それ以外の場合:仮数部の第nバイト = 101 - M(n-1)
上記の符号化において、Mnは0以上且つ99以下であるので、仮数部バイトの値に0X00が出現することがない。表現対象の数が短い仮数部で表現可能な場合には、Oracle−numberは21バイトよりも短く切り詰められる。即ち、Oracle−numberの仮数部には後続ゼロは許されていない。なお負数の表現においては、仮数部が 20バイトよりも短い場合には、仮数の終端を示すため、最後のバイトにターミネータとして102(0X66)が格納される。
【0040】
Oracle−numberでは、上記のような符号化方式を採用することで、バイト列としてみたときの大小関係、即ちC標準関数memcmpによる比較に基づく大小関係と、Oracle−numberの数値としての大小関係とが等しくなる。
【0041】
図1は、Oracle−numberの具体例の表を示す図である。例えば10E+0(=10×1000)の表現において、指数部は193(=0+193)であり、仮数部は11(=10+1)である。また例えば10E+1(=1×1001)の表現において、指数部は194(=1+193)であり、仮数部は2(=1+1)である。また例えば負の数−10E−130(=−10×100−65)の表現において、指数部は127(=62−(−65))であり、仮数部は91(=101−10)である。また例えば負の数−10E−129(=−1×100−64)の表現において、指数部は126(=62−(−64))であり、仮数部は100(=101−1)である。なお負の数には、最後のバイトにターミネータとして102が付加されている。更に、正の無限大Inf及び負の無限大−Infには、表中に示すような特別なバイト列が割り当てられている。
【0042】
図2は、コンピュータシステムの構成の一例を示す図である。図2に示すコンピュータシステムは、プロセッサ110及びメモリ111を含む。演算処理装置としてのプロセッサ110は、2次キャッシュ部112、1次キャッシュ部113、制御部114、及び演算部115を含む。1次キャッシュ部113は、命令キャッシュ113A及びデータキャッシュ113Bを含む。演算部115は、レジスタ116、演算制御部117、及び演算器118を含む。演算器118には演算回路119が含まれる。なお図2及び以降の同様の図において、各ボックスで示される各機能ブロックと他の機能ブロックとの境界は、基本的には機能的な境界を示すものであり、物理的な位置の分離、電気的な信号の分離、制御論理的な分離等に対応するとは限らない。各機能ブロックは、他のブロックと物理的にある程度分離された1つのハードウェアモジュールであってもよいし、或いは他のブロックと物理的に一体となったハードウェアモジュール中の1つの機能を示したものであってもよい。各機能ブロックは、他のブロックと論理的にある程度分離された1つのモジュールであってもよいし、或いは他のブロックと論理的に一体となったモジュール中の1つの機能を示したものであってもよい。
【0043】
上記コンピュータシステムはCPU(Central Processing Unit)を用いた情報処理装置を模式化したものであり、このコンピュータシステムによりOracle−numberを演算するハードウエアを実現する。その際、システム構成を大幅に変更することなく、新機能を演算部115の機能として追加することが望まれる。そこで、新機能追加による変更部分が可能な限り少なくなるような実現方法をめざす。例えば、現状のCPUにおいては、演算器の入出力は、通常2オペランド入力且つ1出力の形であり、各オペランドのデータ幅は8バイト(64ビット)幅である。ハードウエアの変更量を小さく抑えるためには、この構造を大きく変えないことが望まれる。
【0044】
プロセッサ110では、1次キャッシュ部113及び2次キャッシュ部112を設けることにより、キャッシュメモリを多階層化した構成となっている。具体的には、1次キャッシュ部113と主記憶(メモリ111)との間に、主記憶よりも高速にアクセスできる2次キャッシュ部112を設けている。これにより、1次キャッシュ部113においてキャッシュミスが発生した場合に、主記憶にアクセスが必要になる頻度を低くして、キャッシュミス・ペナルティーを軽減することができる。
【0045】
制御部114は、命令フェッチアドレスと命令フェッチリクエストとを1次命令キャッシュ40に発行し、この命令フェッチアドレスから命令をフェッチする。制御部114は、フェッチした命令をデコードした結果に従い演算部115を制御して、フェッチされた命令を実行する。演算制御部117は、制御部114の制御下で動作し、演算対象のレジスタ116からのデータを演算器118に供給したり、演算結果のデータを指定されたレジスタ116に格納したりする。また演算制御部117は、演算器118が実行する演算のタイプを指定する。更に演算制御部117は、アクセス先のアドレスを指定し、1次キャッシュ部113の当該アドレスに対してロード命令やストア命令を実行する。ロード命令により、指定アドレスから読み出されたデータは、指定されたレジスタ116に格納される。またストア命令により、指定されたレジスタ116のデータが、指定されたアドレスに書き込まれる。
【0046】
まず、Oracle−numberのサブセットであるoraclenum64を定義する。oraclenum64は有効な仮数部の長さが7バイト以下であるようなOracle−numberである。
【0047】
図3は、oraclenum64の構成を示す図である。oraclenum64の数を表現するデータ121は、8バイト長のレジスタに格納することができる。なお、符号及び指数部を含めた長さが8バイトに満たないOracle−numberをoraclenum64としてレジスタに格納する際には、図3にバイト122として示すようにデータを左詰めにして格納する。そして右側の余りの部分には、0X00の値を有するバイト123を余りのバイト数に等しい数だけ格納する。
【0048】
図4は、長さが9バイトのoraclenum64の構成を示す図である。図4に示すように、長さが9バイトである負のOracle−numberのデータ125は、7バイト長の仮数部126に続いて最後のバイト(第9バイト)にターミネータ127(0X66)が付加されている。このOracle−numberは、有効な仮数部126の長さが7バイトであるので、oraclenum64である。このことはoraclenum64を符号反転した数が必ずoraclenum64となるために必要である。
【0049】
図5は、oraclenum64を直接演算対象とできる演算器の構成の一例である。図5の演算器は、図2の演算回路119の一部分に相当する。図5に示す演算器は、入力Xレジスタ131、入力Yレジスタ132、内部形式変換回路133及び134、指数仮数演算回路135、セレクタ136及び137、シフタ138及び139、指数加算器140、及び絶対値加算器141を含む。演算器は更に、正規化回路142、丸め回路143、外部形式変換回路144、及び出力Zレジスタ145を含む。内部形式変換回路133及び134と外部形式変換回路144とを工夫することで、例えばoraclenum64とIEEE754−decimal64との両方に対応させることも可能である。図5において、入力と出力は同形式同精度の浮動小数点数とする。入力データは正規化されていなくてもよい。出力データは正規化される。入力データはoraclenum64フォーマットとし、正規化されていないデータも解釈可能である。出力データはoraclenum64フォーマットの通りに出力される。
【0050】
内部形式変換回路133及び134により、入力を符号部、指数部、及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの符号、指数、仮数をそれぞれ符号X、指数X、仮数Xとする。入力Yの符号、指数、仮数をそれぞれ符号Y、指数Y、仮数Yとする。
【0051】
指数仮数演算回路135が、指数X及び指数Yと、仮数X及び仮数Yとを受け取る。指数仮数演算回路135は、指数Xと指数Yの大小比較をする。大小比較の結果に基づいて、指数仮数演算回路135は、指数の大きい側の仮数(第1の仮数)がシフタ138に入力され、且つ、指数の小さい側の仮数(第2の仮数)がシフタ139に入力されるように、セレクト信号を生成する。指数仮数演算回路135は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、指数Xと指数Yとの差の絶対値の方が大きい場合は、第1の仮数の先行ゼロ計数値をシフタ138の左シフト量として出力する。指数Xと指数Yとの差の絶対値の方が小さい場合は、指数仮数演算回路135は、指数Xと指数Yとの差の絶対値をシフタ138の左シフト量として出力する。ここで、先行ゼロ計数値とは、仮数部の最上位桁から連続するゼロを計数した値をいう。
【0052】
指数仮数演算回路135は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、指数Xと指数Yとの差の絶対値の方が大きい場合は、指数Xと指数Yとの差の絶対値から第1の仮数の先行ゼロ計数値を減算した値をシフタ139の右シフト量として出力する。指数Xと指数Yとの差の絶対値の方が小さい場合は、指数仮数演算回路135は、ゼロをシフタ139の右シフト量として出力する。指数仮数演算回路135は更に、指数の小さい側に上述の右シフト量を加算した値を指数として出力する。
【0053】
シフタ138は、入力されたシフト量に基づき、入力された仮数を左シフトする。シフタ139は、入力されたシフト量に基づき、入力された仮数を右シフトする。各シフタのシフト結果は絶対値加算器141に入力される。
【0054】
減算の場合は、片方の仮数が反転され、絶対値加算器141にキャリーが入力される。絶対値加算器141による加算の結果桁あふれが生じた場合は、1桁右にシフトした値が出力される。同時に、絶対値加算器141から指数加算器140にキャリーが送られ、送られたキャリーが指数に加算される。
【0055】
絶対値加算器141による加算の結果桁落ちが生じた場合は、1桁左にシフトした値が出力される。同時に、絶対値加算器141から指数加算器140に桁落ちを示す信号が送られ、指数から減算される。乗算や除算の場合は、加算結果を再利用するループ演算回路を用いてもよい。
【0056】
正規化回路142が加算結果を受け取り、正規化演算結果を出力する。丸め回路143が、正規化演算結果を丸める。外部形式変換回路144は、丸め処理後の正規化演算結果を外部形式に変換し、出力Zレジスタ145に出力する。
【0057】
図6は、指数仮数演算回路の構成の一例を示す図である。図6に示す指数仮数演算回路135は、比較回路151、絶対値加算器152、セレクタ153及び154、加算器155、先行ゼロ計数回路156、セレクタ157及び158、及び加算器159を含む。
【0058】
比較回路151は、指数Xと指数Yとの大小比較をし、指数の大きい側の仮数(第1の仮数)がシフタ138に入力され、指数の小さい側の仮数(第2の仮数)がシフタ139に入力されるように、セレクト信号を生成する。絶対値加算器152は、指数Xと指数Yの差の絶対値を計算する。先行ゼロ計数回路156は、セレクトされた仮数の先行ゼロを計数する。加算器155は、指数Xと指数Yとの差の絶対値とセレクトされた仮数の先行ゼロ計数値とを比較し、比較結果に応じたセレクト信号を出力する。セレクタ158は、差の絶対値の方が大きい場合、先行ゼロ計数値をシフタ138の左シフト量として出力する。セレクタ158は、差の絶対値の方が小さい場合、差の絶対値をシフタ138の左シフト量として出力する。
【0059】
セレクタ157は、差の絶対値の方が大きい場合、差の絶対値から先行ゼロ計数値を減算した値をシフタ139の右シフト量として出力する。セレクタ157は、差の絶対値の方が小さい場合、ゼロをシフタ139の右シフト量として出力する。
【0060】
加算器159は、セレクタ153から小さい側の指数を受け取る。加算器159は、受け取った小さい側の指数に上述の右シフト量を加算して求めた値を、指数として出力する。
【0061】
図7は、正規化回路の構成の一例を示す図である。図7に示す正規化回路142は、先行ゼロ計数回路160、シフト量補正回路161、左シフタ162、指数演算器163、ビットシフタ164及び165、及びセレクタ166を含む。
【0062】
仮数は桁あふれを考慮する場合は最上位側が1桁多い幅で入力される。先行ゼロ計数回路160は、最上位桁の1つ上の桁を除いた仮数を受け取り、先行ゼロを計数することにより得られた計数値を出力する。シフト量補正回路161は、先行ゼロ計数値と指数の最下位ビットとを受け取る。先行ゼロ計数値の最下位ビット(偶奇を表す)と指数の最下位ビットとをXOR(排他的論理和)した値が1の場合、シフト量補正回路161は、先行ゼロ計数値から1を減じた値を左シフト量として出力する。また上記XOR値が0の場合、シフト量補正回路161は、先行ゼロ計数値を左シフト量として出力する。
【0063】
左シフタ162は、最上位桁の1つ上の桁を除いた仮数とシフト量とを受け取り、指定されたシフト量だけ仮数を左シフトした値を出力する。セレクタ166は、入力の最上位桁の1つ上の桁が0の場合、左シフタ162が出力する左シフトした結果を選択する。またセレクタ166は、入力の最上位桁の1つ上の桁が1であり且つ指数の最下位ビットが0の場合、最上位桁の1つ上の桁を含む入力仮数を2桁右シフトした値を選択する。またセレクタ166は、入力の最上位桁の1つ上の桁が1であり且つ指数の最下位ビットが1の場合、最上位桁の1つ上の桁を含む入力仮数を1桁右シフトした値を選択する。セレクタ166の選択した値は、仮数として出力される。
【0064】
指数演算器163は、指数、シフト量、及び入力仮数の最上位桁を受け取る。入力仮数の最上位桁が0の場合、指数演算器163は、指数からシフト量を減算した結果を指数として出力する。入力仮数の最上位桁が1であり且つ指数の最下位ビットが0の場合、指数演算器163は、指数に2を加算した結果を指数として出力する。入力仮数の最上位桁が1であり且つ指数の最下位ビットが1の場合、指数演算器163は、指数に1を加算した結果を指数として出力する。
【0065】
図8は、先行ゼロ計数回路の構成の一例を示す図である。図8(a)に示すように、先行ゼロ計数回路は、変換回路160を含む。変換回路160は仮数を入力データとして受け取り、図8(b)に示すテーブルに従い入力データから出力データを生成する。この出力データが先行ゼロ計数値であり、2進数により計数値が表わされる。テーブルでは、一番左側のXはゼロ以外の値を表し、それ以外のXはドントケアを表す。0は計数対象となるゼロを表す。
【0066】
図9は、内部形式変換回路の構成の一例を示す図である。図9に示す内部形式変換回路133又は134は、セレクタ170乃至174、加算器175及び176、及び2進10進変換回路177及び178を含む。
【0067】
入力されたデータは、符号部S、指数部EXP、仮数部M01、M02、・・・に分割される。符号部Sは1ビットであり、符号としてそのまま出力される。符号は1の場合に正を表す。
【0068】
指数部EXPは7ビットである。セレクタ170は、符号が1の場合、指数部EXPをそのまま指数として出力する。またセレクタ170は、符号が0の場合、指数部EXPを反転した値を指数として出力する。
【0069】
仮数部M01、M02、・・・の各々は、8ビット長のデータである。セレクタ171は、符号が1の場合は仮数を選択し、符号が0の場合は仮数の反転値を選択する。この選択値が加算器175の一方の入力となる。またセレクタ172は、符号が1の場合は−1を選択し、符号が0の場合は+101を選択する。この選択値が加算器175のもう一方の入力となる。また、符号が0の場合には、加算器175にキャリーが入力される。セレクタ173及び174並びに加算器176についても同様である。
【0070】
加算器175及び176の出力が、それぞれ、2進10進変換回路177及び178により2進形式からBCD形式の値に変換され、BCD変換後の値が仮数として出力される。ただし、加算器からのCOが0の場合には、変換後のBCD値は強制的にゼロとなる。
【0071】
図10は、外部形式変換回路の構成の一例を示す図である。図10に示す外部形式変換回路144は、デコーダ180、10進2進変換回路181及び182、セレクタ183乃至187、及び加算器188及び189を含む。図10では、2つの仮数部BCD01、BCD02のみに対する回路部分が明示的に示されるが、仮数部の数が2以上の場合には、同様の回路部分がそれらの仮数部に対して設けられる。
【0072】
入力された1ビットの符号部は、そのまま符号として出力される。符号は1の場合に正を表す。指数部の入出力は7ビットである。セレクタ値183により、符号が1の場合は入力指数がそのまま出力指数となり、符号が0の場合は入力指数の反転値が出力指数となる。仮数部BCD01、BCD02、・・・は、1つの入力BCDあたり8ビットであり、10進2進変換回路181、182、・・・によりBCDから2進数に変換される。
【0073】
ターミネータ選択信号を受け取るデコーダ180は、終端の桁を現すターミネータ桁を選択するターミネータ桁セレクト信号を生成する。このターミネータ桁セレクト信号は、後段のセレクタ184、185、・・・に分配される。
【0074】
加算器188、189、・・・の各々において、一方の入力には、符号が1の場合は仮数がそのまま入力され、符号が0の場合は仮数の反転値が入力される。但し、ターミネータ桁セレクト信号が1の場合は、ゼロが選択されて入力される。もう一方の入力には、符号が1の場合は+1が入力され、符号が0の場合は+101が入力される。但し、ターミネータ桁セレクト信号が1の場合は、+101が選択されて入力される。ここで実際に加算したい値は+102であるが、+101にキャリーインが加算されることで、+102を加算することと同等になる。また、符号が0の場合には加算器にキャリーインが入力される。加算器188、189、・・・の出力が、各桁の仮数として出力される。
【0075】
図11は、固定精度浮動小数点数加算の具体例を示す図である。図11において、入力Xの指数をEx、入力Yの指数をEy、入力Xの先行ゼロ計数値をLx、入力Yの先行ゼロ計数値をLyとする。また出力Zの指数をEzとする。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうため、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。このためにEx−Eyを計算し、Lxと比較する。図11に示す具体例ではLxのほうが大きい。即ち、左シフト量Ex−Eyが先行ゼロの数内に収まるので、入力Xの仮数191のみ左シフトされる。入力Yの仮数192は右シフトされない。左シフト量はEx−Eyであり、右シフト量は0である。
【0076】
このようにして桁合わせされた数同士、即ち仮数191を左シフトして得られた仮数193と仮数192とを加算する。更に、加算結果194を正規化し、先行ゼロ計数値が1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁左シフトが必要だが、指数が0から1となり奇数になるので、左シフト量は1減らされて0となり、指数は0のままである。その結果、正規化により加算結果は変化せず、そのまま演算結果の仮数194及び対応する指数Ezを含む演算結果として出力される。
【0077】
図12は、固定精度浮動小数点数加算の別の具体例を示す図である。この具体例では必要な左シフト量Ex−EyよりもLxのほうが小さい。この場合、必要な左シフト量Ex−Eyが先行ゼロ計数値の数内に収まらないので、入力Xの仮数201をLx分だけ左シフトし、左シフトしきれなかった分だけ入力Yの仮数202を右シフトする。即ち、左シフト量はLxであり、右シフト量は(Ex−Ey)−Lxである。
【0078】
このようにして桁合わせされた数同士、即ち仮数201を左シフトして得られた仮数203と仮数202を右シフトして得られた仮数204とを加算する。このとき、右シフトによって溢れた桁も保持する。更に、加算結果205を正規化し、先行ゼロ計数値が1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁右シフトが必要だが、指数Ezが2から3となり奇数になるので、右シフト量は1増やされて2となり、指数Ezは2から4となる。
【0079】
その後、正規化した結果206に対して丸め処理を実行する。この例においては右にはみ出した桁を四捨五入することにより実行される。このようにして丸められた結果が、丸め結果の仮数207及び対応する指数Ezを含む演算結果として出力される。
【0080】
以下に、1つのOracle−numberを複数のoraclenum64を含む組により表現する方法について説明する。
【0081】
最大で21バイト長のOracle−numberの計算を、oraclenum64 演算ハードウエアを用いて実現するためには、Oracle−numberを複数のoraclenum64を含む組で表現する必要がある。
【0082】
図13は、21バイト長のOracle−numberを3つの部分に分ける方法を示す図である。図22に示されるように、最大20バイト長の仮数部210は、7バイトの仮数部211、7バイトの仮数部212、及び6バイトの仮数部213に分割される。
【0083】
図14は、分割された3つの仮数部にそれぞれ対応するoraclenum64数を生成する方法を示す図である。a0については、元のOracle−numberの先頭8バイト部分(1バイトの符号及び指数部214+7バイトの仮数部211)を切り出してくるだけで、oraclenum64形式の数が得られる。a1及びa2については、元のOracle−numberの第1バイト(符号及び指数部214)を加工する必要がある。具体的には、元のOracle−numberの基数10での指数をEとして、a1の指数E1=E−14とすることで、a1についての1バイトの符号及び指数部215を生成する。この符号及び指数部215に7バイトの仮数部212を付加して、a1に相当するoraclenum64形式の数が得られる。またa2の指数E2=E−28とすることで、a2についての1バイトの符号及び指数部216を生成する。この符号及び指数部216に6バイトの仮数部213及び1バイトの"0"を付加して、a2に相当するoraclenum64形式の数が得られる。このようにして得られた3つのoraclenum64の組を、以下においてtriple−oraclenum64と呼ぶ。
【0084】
以下に、triple−oraclenum64形式に対する四則演算をoraclenum64演算器により実行する構成について説明する。まず、最も基本となる、oraclenum64の数同士の正確な和を求める演算について説明する。以下に示すtwo−sum(2数の和)は、非特許文献1にformula(4.16)として示されているものであり、同様のものが非特許文献2のp.18、及び、非特許文献3のalgorithm4に示されている。
【0085】
Two_sum(X, Y)
z = fl(X + Y)
w = fl(z - X)
v = fl(z - w)
z1 = fl(Y - w)
z2 = fl(v - X)
zz = fl(z1 - z2)
return(z, zz)
ここでfl(X+Y)は、X+Yの真の値を、浮動小数点数にマッピングした結果、即ち浮動小数点形式の限られた精度内で表現した結果を示す。上記のTwo_sumによって得られる2数z及びzzは、正確な意味においてz+zz=X+Yを満たす。zはX+Yの最重要部(most significant part)を固定精度浮動小数点の精度内で表現した値であり、zzは固定精度浮動小数点の精度で表現しきれなかった残余分を表す。
【0086】
マッピング時に発生する丸め処理方法として、10進数で代表的な丸め方法である四捨五入を例に取り説明する。簡単のために固定精度浮動小数点数の精度は10進2桁とする。この場合、20000と−1との2数の和は、上記のTwo_sumにより以下のように計算される。
【0087】
X = 20000
Y = -1
z = fl(X+Y) = 20000
w = fl(z−X) = 0
v = fl(z−w) = 20000
z1 = fl(Y−w) = -1
z2 = fl(v−X) = 0
zz = fl(z1−z2) = -1
この例のように、一般に、two_sumの結果であるzとzzは異符合となり得る。一方、丸め方法を切り捨てとした場合は、XとYとで有効桁がオーバーラップしない場合には、以下の例のようにz+zzがX+Yと等しくならない場合がある。
【0088】
X = 20000
Y = -1
z = fl(X+Y) = 19000
w = fl(z−X) = -1000
v = fl(z−w) = 20000
z1 = fl(Y−w) = 990
z2 = fl(v−X) = 0
zz = fl(z1−z2) = 990
ここで、Xの絶対値がYの絶対値より大きいか等しいと仮定し、更に以下のような新たな丸め処理を行うことにより、zzの算出が容易になることを示す。
【0089】
(1)XとYとの間で有効桁のオーバーラップが無い場合は四捨五入する
(2)XとYとの間で有効桁のオーバーラップがある場合は切り捨てる
但し、XとYとの間で有効桁がオーバーラップしていない場合であっても、XとYとの間で有効桁が連続している場合は(2)に含めることにする。
【0090】
具体的な例を用いて、上記のような丸め処理を適用することの効果を説明する。前述の場合と同様に固定精度浮動小数点数の精度は10進2桁である。また、XとYとの間で有効桁が連続している場合の例を示す。まず上記の特殊な丸め処理ではなく、flが常に四捨五入の丸め処理を行なう場合には、以下のようになる。
【0091】
X = 2000
Y = 52
z = 2100
w = 100
v = 2000
z1 = -48
z2 = 0
zz = -48
それに対して、上記の新たな丸め処理を用いる場合は、以下のようになる。
【0092】
X = 2000
Y = 52
z = 2000
w = 0
v = 2000
z1 = 52
z2 = 0
zz = 52
上記の新たな丸め処理を用いることにより、以下の効果が得られる。まず(1)の場合には、オーバーラップがないので、X+Yを行った後の四捨五入による丸め処理や、四捨五入によって発生したwを補正するために必要であったz1を求める演算処理がなくなる。また(2)の場合には、X+Yの精度は有効桁数の2倍以下であることが保証され、丸め処理が切り捨てのみとなるため、演算を実行するハードウエアの実現が容易となる。
【0093】
以上のことから、2つの入力値の絶対値を比較して、その比較結果に応じて上記の(1)又は(2)の場合分けを行ない、新たな丸め処理を実行すれば、zzの算出が容易となる。また更に、z,zzを求める演算get_z(x,y),get_zz(x,y)をハードウエアで実行する回路を設ければ、以下に示すように、two_sumを高速に処理することが可能となる。
【0094】
Two_sum_fast(x, y)
z = get_z(x, y)
zz = get_zz(x, y)
return(z, zz)
図15は、get_z演算を実現する回路の構成の一例を示す図である。図15の演算器は、図2の演算回路119の一部分に相当する。図15に示す演算器は、入力Xレジスタ221、入力Yレジスタ222、内部形式変換回路223及び224、指数仮数演算回路225、セレクタ226及び227、シフタ228及び229、指数加算器230、及び絶対値加算器231を含む。演算器は更に、セレクタ232及び233、正規化回路234、外部形式変換回路235、及び出力Zレジスタ236を含む。図15において、図5に示す回路と同一又は対応する構成要素は同一又は対応する名称で参照する。図15において、入力と出力は同形式同精度の浮動小数点数とする。入力データは正規化されていなくてもよい。出力データは正規化される。入力データはoraclenum64フォーマットとし、正規化されていないデータも解釈可能である。出力データはoraclenum64フォーマットの通りに出力される。
【0095】
内部形式変換回路223及び224により、入力を符号部、指数部、及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの符号、指数、仮数をそれぞれ符号X、指数X、仮数Xとする。入力Yの符号、指数、仮数をそれぞれ符号Y、指数Y、仮数Yとする。
【0096】
指数仮数演算回路225が、指数X及び指数Yと、仮数X及び仮数Yとを受け取る。指数仮数演算回路225は、指数Xと指数Yの大小比較をする。大小比較の結果に基づいて、指数仮数演算回路225は、指数の大きい側の仮数(第1の仮数)がシフタ228に入力され、且つ、指数の小さい側の仮数(第2の仮数)がシフタ229に入力されるように、セレクト信号を生成する。指数仮数演算回路225は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、前者の方が大きい場合は、後者をシフタ228の左シフト量として出力する。前者の方が小さい場合は、指数仮数演算回路225は、前者をシフタ228の左シフト量として出力する。
【0097】
指数仮数演算回路225は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、指数Xと指数Yとの差の絶対値の方が大きい場合は、指数Xと指数Yとの差の絶対値から第1の仮数の先行ゼロ計数値を減算した値をシフタ229の右シフト量として出力する。指数Xと指数Yとの差の絶対値の方が小さい場合は、指数仮数演算回路225は、ゼロをシフタ229の右シフト量として出力する。指数仮数演算回路225は更に、指数の小さい側に上述の右シフト量を加算した値を指数として出力する。
【0098】
指数仮数演算回路225は更に、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が14以上であるか否かを判定する。この絶対値が14以上である場合、指数仮数演算回路225は、第1の仮数と第1の仮数に対応する指数とがセレクタ232及び233により選択されるように、セレクト信号を生成する。これにより、上記絶対値が14以上である場合には、第1の仮数が、シフタ228及び絶対値加算器231をバイパスして、正規化回路234に入力されることになる。
【0099】
シフタ228は、入力されたシフト量に基づき、入力された仮数を左シフトする。シフタ229は、入力されたシフト量に基づき、入力された仮数を右シフトする。各シフタのシフト結果は絶対値加算器231に入力される。
【0100】
減算の場合は、片方の仮数が反転され、絶対値加算器231にキャリーが入力される。絶対値加算器231による加算の結果桁あふれが生じた場合は、1桁右にシフトした値が出力される。同時に、絶対値加算器231から指数加算器230にキャリーアウトが送られ、指数に加算される。
【0101】
絶対値加算器231による加算の結果桁落ちが生じた場合は、1桁左にシフトした値が出力される。同時に、絶対値加算器231から指数加算器230に桁落ちを示す信号が送られ、指数から減算される。
【0102】
セレクタ232及び233は、指数仮数演算回路225によって生成されたセレクト信号に応じて、加算結果の指数及び仮数、又は、第1の仮数及びそれに対応する指数を選択する。正規化回路234が、セレクタ232及び233により選択された指数及び仮数を受け取り、正規化演算結果を出力する。外部形式変換回路235は、正規化演算結果を外部形式に変換し、出力Zレジスタ236に出力する。
【0103】
図16は、get_z演算の具体例を示す図である。図16において、入力Xの指数をEx、入力Yの指数をEy、入力Xの先行ゼロ計数値をLx、出力Zの指数をEzとする。この例において実行する演算は、図16に示すget_z演算240である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうために不可能であるので、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。このためにEx−Eyを計算し、Lxと比較する。図16に示す具体例ではLxのほうが大きい。即ち、左シフト量Ex−Eyが先行ゼロの数内に収まるので、入力Xの仮数241のみ左シフトされる。入力Yの仮数242は右シフトされない。左シフト量はEx−Eyであり、右シフト量は0である。
【0104】
このようにして桁合わせされた数同士、即ち仮数241を左シフトして得られた仮数243と仮数242のままである仮数244とを加算する。更に、加算結果245を正規化し、先行ゼロ計数値が1以上の場合は先行ゼロ計数値だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁左シフトが必要だが、指数が0から1となり奇数になるので、左シフト量は1減らされて0となり、指数は0のままである。この例では、正規化による変化はない。更に正規化結果の仮数246の上位桁を選択する。例えば入力フォーマットの仮数が14桁である場合は、最上位から14桁を上位桁、最上位から15桁目以降を下位桁とする。
【0105】
上記の演算の結果、仮数247及び対応する指数Ezを含む演算結果が出力される。
【0106】
図17は、get_z演算の別の具体例を示す図である。この例において実行する演算は、図17に示すget_z演算250である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうために不可能であるので、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。このためにEx−Eyを計算し、Lxと比較する。図17に示す具体例ではLxのほうが小さい。即ち、左シフト量Ex−Eyが先行ゼロの数内に収まらないので、入力Xの仮数251をLx分だけ左シフトし、左シフトしきれなかった分だけ入力Yの仮数252を右シフトする。即ち、左シフト量はLxであり、右シフト量は(Ex−Ey)−Lxである。
【0107】
このようにして桁合わせされた数同士、即ち仮数251を左シフトして得られた仮数253と仮数252を右シフトして得られた仮数254とを加算する。このとき、右シフトによって溢れた桁も保持する。更に、加算結果255を正規化し、先行ゼロが1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁右シフトが必要だが、指数が2から3となり奇数になるので、右シフト量は1増やされて2となり、指数は2から4となる。このようにして得られた正規化の結果の仮数256の上位桁を選択する。例えば入力フォーマットの仮数が14桁である場合は、最上位から14桁を上位桁、最上位から15桁目以降を下位桁とする。
【0108】
上記の演算の結果、演算結果の仮数257が出力されるとともに、対応する指数Ezが演算結果の指数として出力される。
【0109】
図18は、get_z演算の更に別の具体例を示す図である。この例において実行する演算は、図18に示すget_z演算260である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうため、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。但し、桁合わせした結果、2つの入力の間に14桁以上の差がある場合、即ち、重なりが全くない場合には、実際に演算処理を実行しなくとも演算結果を求めることが可能である。get_zは演算結果の上位側を求める演算であり、2入力の重なりがない場合には値の大きい側がそのまま上位側となるからである。
【0110】
この条件を満たすか否かを確認するため、(Ex−Lx)−(Ey−Ly)を計算し、計算結果が14以上の場合には上記の場合に該当すると判定する。ここで値14は、使用フォーマットにおける仮数の桁数である。この具体例では上記の場合に該当し、仮数261と仮数262との間に重なりが存在しない。この場合、仮数261がそのままバイパスされて加算結果として取り扱われる。
【0111】
更にバイパスされた結果263を正規化し、先行ゼロ計数値が1以上の場合は先行ゼロ計数値だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では3桁左シフトが必要だが、指数が16から13となり奇数になるので、左シフト量は1減らされて2となり、指数は16から14となる。このようにして得られた正規化の結果が、そのまま演算結果の仮数264及び対応する指数Ezを含む演算結果として出力される。
【0112】
なおzzは固定精度の範囲で表現しきれなかった加算演算の残余の部分を表すが、例えば乗算の場合にはzzを出力する命令は一般的である。乗算の場合、zとzzは互いの桁が連続した値である。しかし加算の場合は、2つの入力値の絶対値がフォーマットの桁数以上離れている場合は、zとzzは互いの桁が連続した値とならない。図19(a)に、2つの入力値の絶対値がフォーマットの桁数以上離れている場合の加算演算の例を示す。この第1のケースにおいては、通常のフローで演算を行いzzを出力してもよいが、値の重なりが全くないことを利用すると、演算をしなくとも絶対値の小さい側をそのままzzとすることができ、zzを容易に出力することが可能である。
【0113】
また乗算の場合は、入力の符号は演算結果の仮数の値には影響しないため、zzを求める際に符号を考慮する必要がない。しかし加算の場合は、上記のように2つの入力値の絶対値が離れているとき、互いに異なる符号を有する2つの数の加算(同符号の数同士の減算)において特別な処理が必要である。図19(b)に、2つの入力値の絶対値が離れている場合における互いに異なる符号を有する2つの数の加算演算の例を示す。この第2のケースにおいては、通常のフローで演算を行うと、2つの入力の間のゼロで埋められていた桁に、図19(b)にAとして示すように、桁下がりによってゼロ以外の値が発生する。その結果、zzを表すために必要な精度が、離れた桁数分だけ増えてしまうことになる。従って、この第2のケースにおいては、通常のフローで演算を実行せずに、上記のケース1と同様の方法で絶対値の小さい側をそのままzzとして出力する必要がある。
【0114】
このように、加算におけるzz出力は、乗算の場合には考慮する必要のないケースを考慮しなければならない。従って、実際の回路構成を考える際には、例えばバイパス回路を追加する等の変更が必要となる点が、乗算におけるzz出力回路と異なる部分となる。
【0115】
図20は、get_zz演算を実現する回路の構成の一例を示す図である。図20の演算器は、図2の演算回路119の一部分に相当する。図20において、図15と同一又は対応する構成要素は同一又は対応する番号で参照する。図20に示す演算器は、入力Xレジスタ221、入力Yレジスタ222、内部形式変換回路223及び224、指数仮数演算回路225A、セレクタ226及び227、シフタ228及び229、指数加算器230、及び絶対値加算器231を含む。演算器は更に、セレクタ232及び233、正規化回路234、外部形式変換回路235、出力Zレジスタ236、及び正規化回路270を含む。
【0116】
内部形式変換回路223及び224により、入力を符号部、指数部、及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの符号、指数、仮数をそれぞれ符号X、指数X、仮数Xとする。入力Yの符号、指数、仮数をそれぞれ符号Y、指数Y、仮数Yとする。
【0117】
指数仮数演算回路225Aが、指数X及び指数Yと、仮数X及び仮数Yとを受け取る。指数仮数演算回路225Aは、指数Xと指数Yの大小比較をする。大小比較の結果に基づいて、指数仮数演算回路225Aは、指数の大きい側の仮数(第1の仮数)がシフタ228に入力され、且つ、指数の小さい側の仮数(第2の仮数)がシフタ229に入力されるように、セレクト信号を生成する。指数仮数演算回路225Aは、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、指数Xと指数Yとの差の絶対値の方が大きい場合は、第1の仮数の先行ゼロ計数値をシフタ228の左シフト量として出力する。指数Xと指数Yとの差の絶対値の方が小さい場合は、指数仮数演算回路225Aは、指数Xと指数Yとの差の絶対値をシフタ228の左シフト量として出力する。
【0118】
指数仮数演算回路225Aは、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し指数Xと指数Yとの差の絶対値の方が大きい場合は、指数Xと指数Yとの差の絶対値から第1の仮数の先行ゼロ計数値を減算した値をシフタ229の右シフト量として出力する。第1の仮数の先行ゼロ計数値の方が小さい場合は、指数仮数演算回路225Aは、ゼロをシフタ229の右シフト量として出力する。指数仮数演算回路225Aは更に、指数の小さい側に上述の右シフト量を加算した値を指数として出力する。
【0119】
指数仮数演算回路225Aは更に、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が14以上であるか否かを判定する。この絶対値が14以上である場合、指数仮数演算回路225は、第2の仮数とそれに対応する指数がセレクタ232及び233により選択されるように、セレクト信号を生成する。これにより、上記(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値がフォーマットの桁数である14以上である場合には、第2の仮数が、シフタ228及び絶対値加算器231をバイパスして、正規化回路234に入力されることになる。
【0120】
シフタ228は、入力されたシフト量に基づき、入力された仮数を左シフトする。シフタ229は、入力されたシフト量に基づき、入力された仮数を右シフトする。各シフタのシフト結果は絶対値加算器231に入力される。
【0121】
減算の場合は、片方の仮数が反転され、絶対値加算器231にキャリーが入力される。絶対値加算器231による加算の結果桁あふれが生じた場合は、1桁右にシフトした値が出力される。同時に、絶対値加算器231から指数加算器230にキャリーが送られ、指数に加算される。
【0122】
絶対値加算器231による加算の結果桁落ちが生じた場合は、1桁左にシフトした値が出力される。同時に、絶対値加算器231から指数加算器230に桁落ちを示す信号が送られ、指数から減算される。
【0123】
正規化回路270が、加算結果と指数演算結果とを受け取り、正規化された指数部と仮数部とを出力する。
【0124】
セレクタ232及び233は、指数仮数演算回路225によって生成されたセレクト信号に応じて、正規化された指数及び仮数、又は、第2の仮数及びそれに対応する指数を選択する。正規化回路234が、セレクタ232及び233により選択された指数及び仮数を受け取り、正規化演算結果を出力する。外部形式変換回路235は、正規化演算結果を外部形式に変換し、出力Zレジスタ236に出力する。
【0125】
図21は、get_zz演算の具体例を示す図である。図21において、入力Xの指数をEx、入力Yの指数をEy、入力Xの先行ゼロ計数値をLx、出力Zの指数をEzとする。この例において実行する演算は、図21に示すget_zz演算280である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうため、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。このためにEx−Eyを計算し、Lxと比較する。図21に示す具体例ではLxのほうが大きい。即ち、左シフト量Ex−Eyが先行ゼロの数内に収まるので、入力Xの仮数281のみ左シフトされる。入力Yの仮数282は右シフトされない。左シフト量はEx−Eyであり、右シフト量は0である。
【0126】
このようにして桁合わせされた数同士、即ち仮数281を左シフトして得られた仮数283と仮数282のままである仮数284とを加算する。更に、加算結果285を正規化し、先行ゼロ計数値が1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁左シフトが必要だが、指数が0から1となり奇数になるので、左シフト量は1減らされて0となり、指数は0のままである。
【0127】
次に、正規化結果の下位桁286を選択する。例えば入力フォーマットの仮数が14桁である場合は、最上位から14桁を上位桁、最上位から15桁目以降を下位桁とする。下位桁選択に伴い、指数は−14される。本具体例では、下位桁はゼロが選択される。
【0128】
更に、選択された下位桁287を正規化する。本具体例では対象データはゼロであるので、正規化前の仮数及び指数がそのまま正規化の結果として出力される。正規化された結果が、演算結果の仮数288及び対応する指数Ezを含む演算結果として出力される。
【0129】
図22は、get_zz演算の別の具体例を示す図である。この例において実行する演算は、図22に示す加算290である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうために不可能であるので、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。このためにEx−Eyを計算し、Lxと比較する。図22に示す具体例ではLxのほうが小さい。即ち、左シフト量Ex−Eyが先行ゼロの数内に収まらないので、入力Xの仮数291をLx分だけ左シフトし、左シフトしきれなかった分だけ入力Yの仮数292を右シフトする。即ち、左シフト量はLxであり、右シフト量は(Ex−Ey)−Lxである。
【0130】
このようにして桁合わせされた数同士、即ち仮数291を左シフトして得られた仮数293と仮数292を右シフトして得られた仮数294とを加算する。このとき、右シフトによって溢れた桁も保持する。
【0131】
更に、加算結果295を正規化し、先行ゼロ計数値が1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁右シフトが必要だが、指数が2から3となり奇数になるので、右シフト量は1増やされて4となり、指数は2から4となる。
【0132】
次に、正規化結果の下位桁296を選択する。例えば入力フォーマットの仮数が14桁である場合は、最上位から14桁を上位桁、最上位から15桁目以降を下位桁とする。下位桁選択に伴い、指数は−14される。
【0133】
更に、選択された下位桁297を正規化する。本具体例では、仮数は2桁左にシフトされ、指数は−10から2が減算されて−12となる。正規化された結果が、演算結果の仮数298及び対応する指数Ezを含む演算結果として出力される。
【0134】
図23は、get_zz演算の更に別の具体例を示す図である。この例において実行する演算は、図23に示すget_zz演算300である。可能な限り高い演算精度を保持するとき、指数値の大きい側を左シフトして桁合わせを行う。但し、先行ゼロの桁数より多く左シフトすることは、上位桁が欠落してしまうため、桁合わせに必要な左シフト量Ex−Eyが先行ゼロの桁数を上回る場合は、指数値の小さい側を右シフトすることで、桁合わせを行う。但し、桁合わせした結果、2つの入力の間に14桁以上の差がある場合、即ち、重なりが全くない場合には、実際に演算処理を実行しなくとも演算結果を求めることが可能である。get_zzは演算結果の下位側を求める演算であり、2入力の重なりがない場合には値の小さい側がそのまま下位側となるからである。
【0135】
この条件を満たすか否かを確認するため、(Ex−Lx)−(Ey−Ly)を計算し、計算結果が14以上の場合には上記の場合に該当すると判定する。ここで値14は、使用フォーマットにおける仮数の桁数である。この具体例では上記の場合に該当し、仮数301と仮数302との間に重なりが存在しない。この場合、仮数302がそのままバイパスされて加算結果として取り扱われる。
【0136】
更にバイパスされた結果303を正規化し、先行ゼロ計数値が1以上の場合はその分だけ左シフトを行い、桁あふれがある場合には1桁分の右シフトを行う。但し、左シフトした結果指数が奇数になる場合は、左シフト量を1減らす。または右シフトした結果指数が奇数になる場合は、右シフト量を1増やす。指数は、左右シフト量に合わせて調整する。左シフトした場合は左シフト量を指数から減算し、右シフトした場合は右シフト量を指数に加算する。本具体例では1桁左シフトが必要だが、指数が0から−1となり奇数になるので、左シフト量は1減らされて0となり、指数は0のままとなる。このようにして得られた正規化の結果が、そのまま演算結果の仮数304及び対応する指数Ezを含む演算結果として出力される。
【0137】
図24は、two_sumの回路図シンボルを示す図である。上述したtwo_sumは、triple−oraclenum64計算において頻繁に用いられる演算である。このtwo_sum演算、即ちxとyとの正確な和を表現するzとzzとを求める演算を、図24に示すような演算子310で表わすものとする。
【0138】
図25は、triple−oraclenum64とoraclenum64の和を求める回路の一例を示す図である。図25に示す回路は、3つのtwo_sum演算子310と再正規化部311とを含む。入力bは1つのoraclenum64の数であり、入力a0,a1,a2はtriple−oraclenum64である。また出力s0,s1,s2もまたtriple−oraclenum64である。図25に示すような回路構成により、triple−oraclenum64とoraclenum64の和を求めることができる。なお再正規化部311が実行する演算については、後述する。
【0139】
図26は、triple−oraclenum64同士の和を求めるアルゴリズムを示す図である。前述のtwo−sumを用いて、triple−oraclenum64同士の和を求めることができる。図26に示すTriple_Addは、第1のtriple−oraclenum64であるa0,a1,a2と第2のtriple−oraclenum64であるb0,b1,b2との和を求める。この演算は、非特許文献2のA.2節に開示されているものと同様である。また非特許文献3に開示されるalgorithm13,14とも同様である。残りの四則演算についても、非特許文献1乃至3に開示の方法を用いて実現可能である。
【0140】
以下に、計算結果の再正規化について述べる。再正規化については、非特許文献2のp.116に述べられており、非特許文献3でもそれを参照している。ここでは、非特許文献2に記載される再正規化をPriestの再正規化と呼ぶ。再正規化前の演算結果(X0,X1,X2,X3)は、概ね絶対値の大きい順に並んでいるが、一般に、一部の桁にオーバーラップがある。また、X0がX0+X1+X2+X3の最重要(most significant)な部分を固定精度で表現した結果になっていない。
【0141】
計算結果(X0,X1,X2,X3)をPriestの方法で再正規化した結果を(a0,a1,a2)とすると、a0+a1+a2は、X0+X1+X2+X3とtripleの範囲で等しく、且つ、以下を満たす。
【0142】
|a0| ≧|a1| ≧ |a2|
E(i+1) ≦ Ei - 14
ここで、Eiは基数を10とした場合の要素aiの指数である。oraclenum64の精度は10進で14桁なので、上記の第2の条件は、要素がオーバーラップしていないことを表わす。
【0143】
Priestの再正規化にも、前述のtwo_sumが用いられる。まず、オーバーラップを除去するために、図27のように接続された3つのtwo_sum演算子310を用いる。これにより得られる(t0,t1,t2,t3)は、オーバーラップしておらず、且つ、0でない要素については絶対値の大きいものから順に並んでいる。これらをt0から順に蓄積していったものを(a0,a1,a2)とすればよい。この蓄積を行なう演算accumulateにもtwo_sumが用いられる。
【0144】
一般に再正規化前の演算結果(X0,X1,X2,X3)の符号は揃ってなく、前述のようにtwo_sumを繰り返した結果である(a0,a1,a2)の符号も揃っていない。そこでPriestの再正規化を行った固定精度浮動小数点数の組に含まれる数の符号が全て同符号な場合を、符号の揃ったPriestの再正規化と呼ぶ。
【0145】
本願では、Priestの再正規化よりも条件の厳しい「強い正規化」を用いる。強い正規化された組(b0,b1,b2)は、次の条件を満たす。なお強い正規化により、b1=0且つb2≠0となる場合が生じるため、|b0|>=|b1|>=|b2|の条件は一般に成り立たない。
【0146】
E(i+1) = Ei - 14
b0,b1,b2:全て同符号
このような強い正規化により、各要素の指数の差と固定小数点数の精度(桁数)とが一致する。従って、強い正規化された組を元のOracle−number表現に戻すことは容易である。
【0147】
まず図27で示されるオーバーラップが無く0以外の数は絶対値の大きいものから順に並んでいる数の組(t0,t1,t2,・・・)から、符号の揃ったPriestの再正規化された数の組(a0,a1,a2,・・・)を得るための処理を示す。ここでfl_truncate(X+Y)は、固定精度浮動小数点数XとYとの和を有効桁で切り捨てる演算を表し、two_sum(X,Y)は前述の通り有効桁に重なりの無い2数を求める演算とする。但しここではtwo_sum内での演算は全て四捨五入で丸め処理されるものとする。
【0148】
a0 = fl_truncate(t0+t1)
(z0,zz0) = two_sum(t0,t1)
zz0=0の場合、以下の様にzz0≠0となるまでt2,t3,・・・を順次accumulateしていく。
【0149】
a0 = fl_truncate(a0+t2)
(z0,zz0) = two_sum(a0,t2)
入力された数の組(t0,t1,t2,・・・)を全てaccumulateされてもzz0=0な場合はそこで処理を終了する。以下zz0≠0となった後の処理を示す。
【0150】
w0 = fl_truncate(z0 - a0)
ここで、two_sumの性質より、
t0+t1+...+ti = z0+zz0 = a0+w0+zz0
となる。但しt0,t1,・・・,tiはzz0≠0となるまでaccumulateされた数である。この時、以下の通りa0と(w0+zz0)は同符号であり、且つ、a0と(w0+zz0)に有効桁の重なりは無いと言える。
【0151】
(i)w0=0の場合:zz0はfl_truncate(t0+t1+...+ti)によって切り捨てられた数に等しいため、a0と(w0+zz0)は同符号であり、且つ、a0と(w0+zz0)に有効桁の重なりは無い。
【0152】
(ii)w0≠0の場合:w0はa0と同符号でa0の有効桁最下位にのみ1が立つ数であり、zz0の絶対値はw0の絶対値よりも小さくzz0とw0は異符号なため、a0と(w0+zz0)は同符号であり、且つ、a0と(w0+zz0)に有効桁の重なりは無い。
【0153】
次に、(w0,zz0,ti+1,...)に対して同様の処理を繰り返すことで、a1,a2,・・・を順次求めることができる。この際、上記(i),(ii)によりa1,a2,・・・は全て同符合となる。
【0154】
図28は、符号の揃ったPriestの再正規化の例を示す図である。この例においては、簡単のために固定精度浮動小数点数は10進4桁とし、two_sumでの丸め処理方法は四捨五入であるとする。図28において、(t0,t1,t2,t3)はオーバーラップしておらず、且つ、0でない要素については絶対値の大きいものから順に並んでいる。これらをt0から順に蓄積していくことで、符号の揃ったPriestの再正規化された数の組a0,a1,a2,a3が得られている。
【0155】
図29は、符号の揃ったPriestの再正規化された数の組から強い正規化された数の組を得る計算の一例を示す図である。強い正規化のためには、符号の揃ったPriestの再正規化された数の組から第2要素以降を適切に量子化してやればよい。図29に示す例では、簡単のために固定精度浮動小数点数は10進4桁としてある。図29に示されるように、符号の揃ったPriestの再正規化された数の組(a0,a1,a2)から強い正規化が行われた数の組(b0,b1,b2)が求められている。
【0156】
図30は、量子化のためのscale_next(X,Y)演算を実現する回路構成の一例を示す図である。図30に示す回路は、指数補正値レジスタ320、入力Xレジスタ321、入力Yレジスタ322、内部形式変換回路323及び324、指数加算器325、シフト量演算回路326、右シフタ327、外部形式変換回路328、及び出力Zレジスタ329を含む。この回路の入力データは以下の条件を満たしていることを前提としている。
【0157】
指数Y ≧ 指数X + t
ここでtはoraclenum64の桁数である。本実施例では、tは例えば14である。
【0158】
内部形式変換回路323及び324により、入力を指数部及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの指数及び仮数をそれぞれ指数X及び仮数Xとする。入力Yの指数を指数Yとする。指数補正値レジスタ320には、予め決められた固定値tが格納される。レジスタ格納値として設定するのではなく、ハード的に固定値を設定してもよい。
【0159】
シフト量演算回路326が指数Xと指数Yと固定値tを受け取る。シフト量演算回路326は、指数Y−指数X−tの演算結果をシフト量として出力する。右シフタ327は、このシフト量と仮数Xとを受け取り、仮数Xを当該シフト量だけ右シフトした結果を出力する。シフトアウトした桁は捨てられる。
【0160】
指数加算器325は、指数Yと固定値tとを受け取り、指数Y−tの演算結果を出力する。外部形式変換回路328は、指数加算器325からの指数と右シフタ327からの仮数を外部形式に変換し、出力Zレジスタ329に出力する。
【0161】
図31は、仮数部を内部形式に変換せずにscale_next演算を行う回路の構成の一例を示す図である。図31において、図30と同一の構成要素は同一の番号で参照し、その説明は適宜省略する。図31では、内部形式変換回路323の代りに内部形式変換回路323Aが設けられ、外部形式変換回路328の代りに外部形式変換回路328Aが設けられている。入力データがoraclenum64形式の場合、右シフタはシフト量2につき8ビットシフトする。
【0162】
内部形式変換回路323A及び324により、入力を指数部及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの指数を指数Xとする。入力Yの指数を指数Yとする。指数補正値レジスタ320には、予め決められた固定値tが格納される。レジスタ格納値として設定するのではなく、ハード的に固定値を設定してもよい。
【0163】
シフト量演算回路326が指数Xと指数Yと固定値tを受け取る。シフト量演算回路326は、指数Y−指数X−tの演算結果をシフト量として出力する。右シフタ327は、このシフト量と仮数Xとを受け取り、仮数Xを当該シフト量だけ右シフトした結果を出力する。シフトアウトした桁は捨てられる。
【0164】
指数加算器325は、指数Yと固定値tとを受け取り、指数Y−tの演算結果を出力する。外部形式変換回路328Aは、指数加算器325からの指数を外部形式に変換し、出力Zレジスタ329に出力する。また右シフタ327の出力する右シフト後の仮数は、そのまま出力Zレジスタ329に出力される。
【0165】
以下に、triple−oraclenum64形式に対する丸め処理を考える。ここでは、丸め処理対象であるtriple−oraclenum64形式の数の組(a0,a1,a2)は再正規化されていることを前提とする。なおこの前提条件は、Priestの再正規化及び強い正規化の何れであってもよい。
【0166】
図32は、Oracle−Database(商標)におけるNUMBER型の3種類の精度指定方法を示す表である。ここで、丸め方向は常に四捨五入である。例えば、計算結果が 1234.56だった場合に、NUMBER(4)、NUMBER(4,−2)、NUMBER(4,1)のそれぞれの指定に対する丸め結果は、以下の通りとなる。
【0167】
NUMBER(4)→1234
NUMBER(4,−2)→1200
NUMBER(4,1)→エラー
最後の例でエラーとなるのは、計算結果である1234.56を小数点1位まで表わすように丸めた結果である1234.6が、4桁の精度内に収まらないためである。
【0168】
triple−oraclenum64形式においても、このような丸め処理を、エラー判定も含めて効率良く実現する必要がある。ここで用いることのできる演算器は、8バイト幅のオペランドを2つの入力として、1つの8バイト幅の数を出力する演算器である。丸め処理においても、このような演算器を前提とする。
【0169】
そこで、triple−oraclenum64で表現された数の丸め処理を、以下の3ステップで実現することにする。
【0170】
1)四捨五入が発生する桁位置のみ5があるような数を生成する。
【0171】
2)triple−oraclenum64形式の数に、上で生成した数を加える。
【0172】
3)適切な桁位置で切捨てを行う。
まず、第1ステップのアルゴリズムについて述べる。以降、丸め対象数のtriple−oraclenum64表現を(a0,a1,a2)とする。また、この組の最重要要素a0の値は、
a0 = M * 100^e
で表わされるとする。また、上式のeを求めるための演算をe(a0)と表すことにする。
【0173】
第1ステップは、精度指定方法により、生成アルゴリズムが異なる。精度指定がない場合(引数なしのNUMBER指定の場合)には、仮数部が20バイト以下となるように丸めが行われる必要がある。
【0174】
精度指定時のアルゴリズムを記述するには、a0を10進表記で表した方が都合がよい。そこで、
a0 = M' * 10^e'
の形で表す。また、仮数部が10>|M'|>=0を満たすように正規化されているものとする。また、前と同様に、e'を求めるための演算をe'(a0)と表す。
【0175】
図33は、四捨五入が発生する桁位置のみ5があるような数を生成するアルゴリズムの例を示す図である。図33(a)及び(b)には、10進桁数による精度指定の場合のアルゴリズムが示される。これら2つのアルゴリズムは、いずれも2入力1出力型の演算器として実現可能である。図33(c)には、スケール(小数点からの相対位置)指定の場合のアルゴリズムが示される。小数点からの相対位置を指定するので、a0に依存しない計算となる。この図33(c)に示すアルゴリズムは、図示した通りの数式をそのままプログラム化してもよいが、nの各値に対応するテーブルを用意しておいて、nをキーにテーブルを引くようなプログラムを用意してもよい。
【0176】
スケール指定があった場合に、丸めた結果が指定精度に収まるか否かは、以下のように判定できる。NUMBER(p,s)が指定された場合、まず、上述の精度指定の場合のアルゴリズムとスケール指定のアルゴリズムとを両方用いて、p_d及びp_sの2つの値を計算する。
【0177】
p_d = get_comma5(a0, digits=p)
p_s = get_comma5(scale=s)
このとき、|p_d|>|p_s|となった場合、すなわちp_dの絶対値がp_sの絶対値よりも大きい場合には、スケール指定で丸められた結果を表現するためには、精度が不足していることがわかる。
【0178】
次に第2ステップでは、第1ステップで生成した数を、triple−oraclenum64で表現された数に加える。この加算には、図25に示したアルゴリズムが利用できる。
【0179】
第3ステップでは、適切な位置で切り捨てを行う。ここでも、第1ステップで生成した数p(精度指定の方式に応じたp_dまたはp_sの何れかの値)を利用することができる。この数pは、四捨五入のために加算される数であり、丸めが発生する桁位置に関する情報を完全に含んでいる。そのため、triple−oraclenum64の各要素とpとの2つのオペランドを入力として、各要素を適切にtruncateする演算を定義することができる。
【0180】
第2ステップの計算結果を(b0,b1,b2)とすると、丸めの第3段階の結果(c0,c1,c2)は、
c0 = truncate(b0, p)
c1 = truncate(b1, p)
c2 = truncate(b2, p)
となる。
【0181】
図34は、get_comma5(precision)を実現する回路構成の一例を示す図である。図34に示す回路は、精度pレジスタ330、入力Xレジスタ331、内部形式変換回路332、先行ゼロ計数回路333、指数加算器334、レジスタ335及び336、セレクタ337、外部形式変換回路338、及び出力Zレジスタ339を含む。
【0182】
内部形式変換回路332により、入力を指数部及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの指数と仮数をそれぞれ指数X、仮数Xとする。先行ゼロ計数回路333は、仮数Xを受け取り、仮数X中の先行ゼロの数を計数する。指数加算器334は、指数X+1−精度p−仮数Xの先行ゼロ計数値を計算する。セレクタ337は、指数加算器334の出力が奇数の場合にはレジスタ336の5000−00を選択し、指数加算器334の出力が偶数の場合にはレジスタ335の0500−00を選択する。
【0183】
指数加算器334から外部形式変換回路338へ供給される指数は、指数加算器334の出力が奇数の場合は当該指数の最下位ビットをゼロとし、指数加算器334の出力が偶数の場合はそのままとする。外部形式変換回路338は、内部形式変換回路332からの符号、指数加算器334からの指数、及びセレクタ337からの仮数を外部形式の数に変換して、変換結果を出力Zレジスタ339に出力する。
【0184】
図35は、truncate演算を実現する回路構成の一例を示す図である。図35の回路は、入力Xレジスタ340、comma5レジスタ341、内部形式変換回路342及び343、先行ゼロ計数回路344、マスク値生成回路345、マスク回路346、外部形式変換回路347、及び出力Zレジスタ348を含む。
【0185】
内部形式変換回路342及び343により、入力を符号、指数部、及び仮数部に分割し、入力の値表現を内部形式に変換する。入力Xの符号、指数、及び仮数をそれぞれ符号X、指数X、及び仮数Xとする。入力comma5の指数と仮数をそれぞれ指数c及び仮数cとする。
【0186】
先行ゼロ計数回路344は、仮数cを受け取り、仮数c中の先行ゼロの数を計数する。マスク値生成回路345は、指数X、指数c、及び仮数cの先行ゼロ計数値を入力として受け取り、これらの入力に応じてマスクデータを生成する。マスク回路346は、仮数Xをマスクデータに応じてマスクし、マスク後の値を仮数として出力する。外部形式変換回路347は、内部形式変換回路342からの符号X及び指数X並びにマスク回路346からの仮数を外部形式の数に変換して、変換結果を出力Zレジスタ348に出力する。
【0187】
図36は、マスク値生成回路の構成の一例を示す図である。図36に示すマスク値生成回路345は、マスク桁演算回路350、デコーダ351、及びセレクタ352−1乃至352−14を含む。マスク桁演算回路350は、指数X、指数c、及び先行ゼロ計数値Lcを受け取り、マスク桁を演算する。マスク桁は、使用フォーマットの仮数の桁数を14とすると、14+(指数c−Lc)−指数Xで求められる。この値は、マスクデータの最下位桁から何桁目までがゼロに設定されるかを示す。このように計算されたマスク桁演算結果に基づいて、デコーダ351が、桁ごとのセレクト信号を生成する。デコーダ351が生成したセレクト信号は、14桁にそれぞれ対応するセレクタ352−1乃至352−14に供給される。マスク桁演算結果がnの場合、下位からn桁は0000側を選択するようにセレクト信号が生成される。マスク桁演算結果が0の場合は、全ての桁が1111側を選択するようにセレクト信号が生成される。このセレクト信号に応じて、セレクタ352−1乃至352−14が、1111又は0000の何れかのビット列を選択し、選択したビット列をマスクデータとして出力する。
【0188】
図37は、p_d及びp_sの絶対値大小比較エラー判定回路の構成の一例を示す図である。この回路は、p_sレジスタ360、p_dレジスタ361、内部形式変換回路362及び363、指数仮数演算回路364、セレクタ365及び366、シフタ367及び368、符号演算器369、加算器370、コンプリメンタ372、コンプリメンタ373、及びエラーフラグレジスタ371を含む。
【0189】
内部形式変換回路362及び363により、入力を指数部、及び仮数部に分割し、入力の値表現を内部形式に変換する。入力p_sの指数、仮数をそれぞれ指数X、仮数Xとする。入力p_dの指数、仮数をそれぞれ指数Y、仮数Yとする。
【0190】
指数仮数演算回路364が、指数X及び指数Yと、仮数X及び仮数Yとを受け取る。指数仮数演算回路364は、指数Xと指数Yの大小比較をする。大小比較の結果に基づいて、指数仮数演算回路364は、指数の大きい側の仮数(第1の仮数)がシフタ367に入力され、且つ、指数の小さい側の仮数(第2の仮数)がシフタ368に入力されるように、セレクト信号を生成する。指数仮数演算回路364は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、前者の方が大きい場合は、後者をシフタ367の左シフト量として出力する。前者の方が小さい場合は、指数仮数演算回路364は、前者をシフタ367の左シフト量として出力する。
【0191】
指数仮数演算回路364は、指数Xと指数Yとの差の絶対値と第1の仮数の先行ゼロ計数値とを比較し、前者の方が大きい場合は、前者から後者を減算した値をシフタ368の右シフト量として出力する。前者の方が小さい場合は、指数仮数演算回路364は、ゼロをシフタ368の右シフト量として出力する。
【0192】
シフタ367は、入力されたシフト量に基づき、入力された仮数を左シフトする。シフタ368は、入力されたシフト量に基づき、入力された仮数を右シフトする。各シフタのシフト結果はコンプリメンタ372、コンプリメンタ373に入力される。
【0193】
コンプリメンタ372は入力された前述のセレクト信号が反転された信号により入力された左シフトの出力をコンプリメントするEOR回路(排他的論理和回路)である。コンプリメンタ373は入力された前述のセレクト信号により入力された右シフトの出力をコンプリメントするEOR回路(排他的論理和回路)である。各コンプリメンタの結果は加算器370に入力される。
【0194】
加算器370にキャリーが入力される。加算器370による加算の結果桁あふれが生じた場合は、符号演算器369にキャリーアウトが供給される。
【0195】
符号演算器369は、加算器370からキャリーアウトを受け取る。符号演算器369は、キャリーアウトの反転値が1であるとき、エラーフラグを1にする。それ以外の場合において、エラーフラグは0である。符号演算器369が生成するエラーフラグは、エラーフラグレジスタ371に格納される。
【0196】
図38は、上記の符号演算器の回路構成の一例を示す図である。図38(a)に示す符号演算器は、インバータ380を含む。この回路により、キャリーアウトの反転値が1のとき、エラーフラグが1になる。図38(b)に示す表は、p_dとp_sの絶対値大小比較エラー判定回路に入力されたp_dとp_sの絶対値の大小関係と、その場合に出力される各信号の対応表である。ここで|p_d|はp_dの絶対値である。p_sについても同様である。
【0197】
図39は、Oracle−numberの長さを求める演算の一例を示す図である。前述の演算の結果として得られたtriple−oracelnum64形式の数を、1つのOracle−numberとしてメモリに書き込む際には、このOracle−numberの長さを求める必要がある。Oracle−numberの長さを求めるには、図39に示されるようにすればよい。但し、length(aX)は、oraclenum64形式での有効桁数を求める演算とする。a2が0であればOracle−numberの長さは短くなるし、更にa1が0であればOracle−numberの長さは更に短くなる。
【0198】
強い再正規化を施したtriple−oracelnum64形式において、a0、a1、a2は、1つのOracle−numberの仮数部を7バイト、7バイト、6バイトの3つの部分に分割した各部を表現している。従って、基本的には、a0、a1、a2の仮数部を連結するだけで、Oracle−number表現が得られる。但し、a0、a1の長さが短い場合には、後続ゼロを拡張してからメモリに格納する必要がある。
【0199】
図40は、expand演算を実現する回路の構成の一例を示す図である。図40の回路は、入力Xレジスタ390、内部形式変換回路391、後続ゼロ計数回路392、桁セレクト演算回路393、及び出力Zレジスタ394を含む。
【0200】
内部形式変換回路391は、入力Xレジスタ390の格納値の仮数部を受け取り、内部形式の仮数部を出力する。後続ゼロ計数回路392は、内部形式の仮数部を受け取り、受け取った仮数部から後続ゼロの数を求め、後続ゼロの計数結果を基にした桁セレクトデータを出力する。桁セレクト演算回路393は、入力Xレジスタ390から格納値の符号部と仮数部とを受け取り、更に後続ゼロ計数回路392から桁セレクトデータを受け取る。符号と桁セレクトデータとに基づいて、桁セレクト演算回路393は、受け取った仮数又はoraclenum64のゼロ(0x01または0x65)の何れかを桁毎に選択して出力する。後続ゼロ計数回路392において後続ゼロの部分であると判断された桁においては、ゼロが選択されて出力される。出力されたデータは出力Zレジスタ394に格納される。
【0201】
図41は、上記の後続ゼロ計数回路の構成の一例を示す図である。図41(a)に示すように、後続ゼロ計数回路は、変換回路400を含む。変換回路400は仮数を入力データとして受け取り、図41(b)に示すテーブルに従い入力データから出力データを生成する。この出力データが後続ゼロ計数値であり、2進数により計数値が表わされる。テーブルでは、一番右側のXはゼロ以外の値を表し、それ以外のXはドントケアである。0は計数対象となるゼロを表わす。
【0202】
図42は、桁セレクト演算回路の構成の一例を示す図である。図42に示す桁セレクト演算回路393は、デコーダ410及びセレクタ411−1乃至411−14を含む。デコーダ410は、符号と後続ゼロ計数値とを受け取り、桁毎の選択信号である桁セレクト信号を生成する。デコーダ410が生成した桁セレクト信号は、例えば14桁にそれぞれ対応するセレクタ411−1乃至411−14に供給される。後続ゼロ計数値がnの場合、下位からn桁は0x01又は0x65側を選択するように桁セレクト信号が生成される。このとき、符号が正を表す1のときは0x01が選択され、符号が負を表す0のときは0x65が選択される。下位より数えてn+1桁から上位の桁は、入力の仮数がそのまま選択される。このようにして桁毎に選択された入力仮数、0x01、又は0x65が、仮数データとして出力される。
【0203】
図43は、固定精度浮動小数点加減算器の構成の一例を示す図である。図43に示す固定精度浮動小数点加減算器は、図5に示す固定精度浮動小数点加減算器に対して、ここまでに説明した種々の演算の機能を纏めて付加することにより得られる回路であり、図2の演算回路119の一部分に相当する。ここで付加される種々の演算は、図15のget_z演算、図20のget_zz演算、図30のscale_next演算、図34のget_comma5演算、図35のtruncate演算、図37のエラー判定、及び図40のexpand演算を含む。図43に示す固定精度浮動小数点加減算器は、値レジスタ450、入力Xレジスタ451、入力Yレジスタ452、内部形式変換回路453及び454、後続ゼロ計数回路455、指数仮数マスク演算回路456、セレクタ457及び458を含む。図43に示す固定精度浮動小数点加減算器は、更に、シフタ459及び460、桁セレクト演算回路461、マスク回路462、符号指数演算回路463、絶対値加算器464、正規化回路465、セレクタ466乃至468、正規化回路469を含む。図43に示す固定精度浮動小数点加減算器は、更に、セレクタ470及び471、丸め回路472、外部形式変換回路473、セレクタ474及び475、エラーフラグレジスタ476、及び出力Zレジスタ477を含む。
【0204】
図43に示す固定精度浮動小数点加減算器の各部は、前述の演算回路の対応する各部に相当する。例えば、後続ゼロ計数回路455及び桁セレクト演算回路461は、図40のexpand演算の後続ゼロ計数回路392及び桁セレクト演算回路393に相当する。また例えばマスク回路462は、図35のtrundate演算のマスク回路346に相当する。また例えば正規化回路465は、図20のget_zz演算の正規化回路270に相当する。例えば正規化回路469は、図15のget_z演算及び図20のget_zz演算の正規化回路234に相当する。また例えばセレクタ468は、図34のget_comma5演算のセレクタ337に相当する。また指数仮数マスク演算回路456及び符号指数演算回路463は、各演算回路の対応する回路部を纏めたものに相当する。これら回路部分の動作については、前述の各演算回路の対応する回路部分の動作と同様である。なお丸め回路472を通す必要のない演算もあるが、セレクタの数を削減するために、この構成例では全ての演算結果を丸め回路472に通す形態としている。丸め処理の必要がない演算については、丸めモードを強制的にゼロ方向に設定することで、丸め回路472を通さなかった場合と同等の結果を得ることができる。
【0205】
図44は、指数仮数マスク演算回路の構成の一例を示す図である。図44に示す指数仮数マスク演算回路456は、比較回路480、絶対値加算器481、セレクタ482乃至486、先行ゼロ計数回路487及び488、加算器491及び492、及びマスク生成回路493を含む。図44に示す指数仮数マスク演算回路456は更に、セレクタ494乃至496、及び加算器497を含む。
【0206】
比較回路480、絶対値加算器481、先行ゼロ計数回路487、セレクタ494及び496、及び加算器492は、図6に示す比較回路151、絶対値加算器152、先行ゼロ計数回路156、セレクタ158及び157、及び加算器155に相当する。但し、絶対値加算器481は、指数X及び指数Yに加え、各演算機能に応じた値を受け取り、所定の加減算を実行する。絶対値加算器481は、get_z演算やget_zz演算の場合には、指数Xと指数Yの差の絶対値を計算する。また例えばscale_next演算の場合であれば、絶対値加算器481は、指数Y−指数X−t(oraclenum64の桁数)の演算結果をシフト量として出力する。また加算器491は、図36のマスク桁演算回路350の機能を実現し、指数X、指数c(comma5の指数)、及び先行ゼロ計数値Lcを受け取り、マスク桁を演算する。マスク生成回路493は、図36のデコーダ351及びセレクタ352−1乃至352−14に相当し、上記マスク桁に応じてマスクデータを生成する。また加算器491は更に、図15及び図20の指数仮数演算回路の機能を実現し、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が14以上であるか否かを判定する。この絶対値が14以上である場合、加算器491は、バイパス経路を選択するためのバイパスセレクト信号を生成する。
【0207】
以上、本発明を実施例に基づいて説明したが、本発明は上記実施例に限定されるものではなく、特許請求の範囲に記載の範囲内で様々な変形が可能である。
【符号の説明】
【0208】
110 プロセッサ
111 メモリ
112 2次キャッシュ部
113 1次キャッシュ部
114 制御部
115 演算部
116 レジスタ
117 演算制御部
118 演算器
119 演算回路
【特許請求の範囲】
【請求項1】
丸め対象データの丸めを行なう演算回路において、
N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、
前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタと、
前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数する第1の先行ゼロ計数部と、
前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出する指数生成部と、
前記指数生成部が生成した丸め指数部と、丸めを行う桁に加算される丸め加算値を保持する第1の出力レジスタを有することを特徴とする演算回路。
【請求項2】
前記演算回路はさらに、
前記指数生成部が生成した丸め指数部に基づき、第1の丸め加算値と第2の丸め加算値のいずれかを選択して丸め加算値を出力する丸め加算値選択部を有することを特徴とする請求項1記載の演算回路。
【請求項3】
前記演算回路はさらに、
前記第1の入力レジスタに保持された第1の形式による丸め対象データを第2の形式による丸め対象データに変換する第1の変換部を有し、
前記先行ゼロ計数部は、前記第2の形式による丸め対象データの仮数部の最上位桁から連続するゼロ値を計数し、
前記指数生成部は、前記第2の形式による丸め対象データの指数部に1を増分した結果から、前記丸め精度と前記先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸めが行われる指数を表す丸め指数部を算出することを特徴とする請求項1又は2記載の演算回路。
【請求項4】
前記演算回路において、
前記第2の形式は、2進化10進法形式であることを特徴とする請求項3記載の演算回路。
【請求項5】
前記演算回路はさらに、
前記第1の出力レジスタに保持された丸め加算値を、前記第1の形式によるデータに変換する第2の変換部を有することを特徴とする請求項1乃至4のいずれか1項に記載の演算回路。
【請求項6】
前記演算回路はさらに、
前記第1の出力レジスタに保持された丸め加算値の最上位桁から連続するゼロ値を計数する第2の先行ゼロ計数部と、
前記仮数部の桁数に前記第1の出力レジスタに保持された丸め指数部を加算した結果から、前記第2のゼロ計数部が計数したゼロ値の数と前記第1の入力レジスタに保持された指数部を減算した、マスクを行なう桁を指定するマスク桁情報を算出するマスク桁情報算出部と、
前記マスク桁算出部が算出したマスク桁情報を用いて、オール1を表す所定値又はオール0を表す所定値のいずれかを所定幅毎に選択することにより、マスクデータを出力するマスクデータ生成部と、
前記第1の入力レジスタに保持された前記仮数部について、前記マスクデータ生成部が生成した複数のマスクデータを用いて、前記仮数部にマスクした結果を出力するマスク部を有することを特徴とする請求項1乃至5のいずれか1項に記載の演算回路。
【請求項7】
前記演算回路はさらに、
第1の出力レジスタに保持された丸め加算値と、丸めを行なう有効桁数に応じて丸めの際に加算される固定加算値を比較し、前記丸め加算値が前記固定加算値よりも大きい場合にエラーを検出するエラー検出部を有することを特徴とする請求項1乃至6のいずれか1項に記載の演算回路。
【請求項8】
丸め対象データの丸めを行なう演算回路と、前記演算回路の演算結果を丸める場合の丸め前処理を制御する丸め前処理命令をデコードする命令制御部とを有する演算処理装置において、
前記演算回路は、
N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、
前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタと、
前記命令制御部による前記丸め前処理命令のデコード結果に基づき、前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数する第1の先行ゼロ計数部と、
前記命令制御部による前記丸め前処理命令のデコード結果に基づき、前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出する指数生成部と、
前記指数生成部が生成した丸め指数部と、丸めを行う桁に加算される丸め加算値を保持する第1の出力レジスタを有することを特徴とする演算処理装置。
【請求項9】
前記演算処理装置はさらに、
前記命令制御部による前記丸め前処理命令のデコード結果に基づき、前記指数生成部が生成した丸め指数部に基づき、第1の丸め加算値と第2の丸め加算値のいずれかを選択して丸め加算値を出力する丸め加算値選択部を有することを特徴とする請求項8記載の演算処理装置。
【請求項10】
前記演算処理装置の演算回路はさらに、
前記第1の入力レジスタに保持された第1の形式による丸め対象データを第2の形式による丸め対象データに変換する第1の変換部を有し、
前記先行ゼロ計数部は、前記第2の形式による丸め対象データの仮数部の最上位桁から連続するゼロ値を計数し、
前記指数生成部は、前記第2の形式による丸め対象データの指数部に1を増分した結果から、前記丸め精度と前記先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸めが行われる指数を表す丸め指数部を算出することを特徴とする請求項8記載の演算処理装置。
【請求項11】
前記演算回路において、
前記第2の形式は、2進化10進法形式であることを特徴とする請求項10記載の演算処理装置。
【請求項12】
前記演算処理装置の演算回路はさらに、
前記第1の出力レジスタに保持された丸め加算値を、前記第1の形式によるデータに変換する第2の変換部を有することを特徴とする請求項8乃至11のいずれか1項に記載の演算処理装置。
【請求項13】
前記演算処理装置の命令制御部はさらに、
前記演算回路の演算結果を丸める丸め演算命令をデコードし、
前記演算処理装置の演算回路はさらに、
前記命令制御部による前記丸め演算命令のデコード結果に基づき、前記第1の出力レジスタに保持された丸め加算値の最上位桁から連続するゼロ値を計数する第2の先行ゼロ計数部と、
前記命令制御部による前記丸め演算命令のデコード結果に基づき、前記仮数部の桁数に前記第1の出力レジスタに保持された丸め指数部を加算した結果から、前記第2のゼロ計数部が計数したゼロ値の数と前記第1の入力レジスタに保持された指数部を減算した、マスクを行なう桁を指定するマスク桁情報を算出するマスク桁情報算出部と、
前記命令制御部による前記丸め演算命令のデコード結果に基づき、前記マスク桁算出部が算出したマスク桁情報を用いて、オール1を表す所定値又はオール0を表す所定値のいずれかを所定幅毎に選択することにより、マスクデータを出力するマスクデータ生成部と、
前記命令制御部による前記丸め演算命令のデコード結果に基づき、前記第1の入力レジスタに保持された前記仮数部について、前記マスクデータ生成部が生成した複数のマスクデータを用いて、前記仮数部にマスクした結果を出力するマスク部を有することを特徴とする請求項9乃至12のいずれか1項に記載の演算処理装置。
【請求項14】
前記演算処理装置の演算回路はさらに、
第1の出力レジスタに保持された丸め加算値と、丸めを行なう有効桁数に応じて丸めの際に加算される固定加算値を比較し、前記丸め加算値が前記固定加算値よりも大きい場合にエラーを検出するエラー検出部を有することを特徴とする請求項8乃至13のいずれか1項に記載の演算処理装置。
【請求項15】
N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタとを有する丸め対象データの丸めを行なう演算回路の制御方法において、
前記演算回路が有する第1の先行ゼロ計数部が、前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数し、
前記演算回路が有する指数生成部が、前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出して丸めを行う桁に加算される丸め加算値を出力することを特徴とする演算回路の制御方法。
【請求項16】
前記演算回路の制御方法はさらに、
前記演算回路が有する丸め加算値選択部が、前記指数生成部が生成した丸め指数部に基づき、第1の丸め加算値と第2の丸め加算値のいずれかを選択して丸め加算値を出力することを特徴とする請求項15記載の演算回路の制御方法。
【請求項17】
前記演算回路の制御方法はさらに、
前記演算回路が有する第2の先行ゼロ計数部が、前記第1の出力レジスタに保持された丸め加算値の最上位桁から連続するゼロ値を計数し、
前記演算回路が有するマスク桁情報算出部が、前記仮数部の桁数に前記前記第1の出力レジスタに保持された丸め指数部を加算した結果から、前記第2のゼロ計数部が計数したゼロ値の数と前記第1の入力レジスタに保持された指数部を減算した、マスクを行なう桁を指定するマスク桁情報を算出し、
前記演算回路が有するマスクデータ生成部が、前記マスク桁算出部が算出したマスク桁情報を用いて、オール1を表す第3の所定値又はオール0を表す所定値のいずれかを所定幅毎に選択することにより、マスクデータを出力し、
前記演算回路が有するマスク部が、前記第1の入力レジスタに保持された前記仮数部について、前記マスクデータ生成部が生成した複数のマスクデータを用いて、前記仮数部にマスクした結果を出力することを特徴とする請求項15記載の演算回路の制御方法。
【請求項18】
前記演算回路の制御方法はさらに、
前記演算回路が有するエラー検出部が、第1の出力レジスタに保持された丸め加算値と、前記丸めを行なう有効桁数に応じて丸めを行う際に加算される固定加算値を比較し、前記丸め加算値が前記固定加算値よりも大きい場合にエラーを検出することを特徴とする請求項15乃至17のいずれか1項に記載の演算回路の制御方法。
【請求項1】
丸め対象データの丸めを行なう演算回路において、
N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、
前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタと、
前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数する第1の先行ゼロ計数部と、
前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出する指数生成部と、
前記指数生成部が生成した丸め指数部と、丸めを行う桁に加算される丸め加算値を保持する第1の出力レジスタを有することを特徴とする演算回路。
【請求項2】
前記演算回路はさらに、
前記指数生成部が生成した丸め指数部に基づき、第1の丸め加算値と第2の丸め加算値のいずれかを選択して丸め加算値を出力する丸め加算値選択部を有することを特徴とする請求項1記載の演算回路。
【請求項3】
前記演算回路はさらに、
前記第1の入力レジスタに保持された第1の形式による丸め対象データを第2の形式による丸め対象データに変換する第1の変換部を有し、
前記先行ゼロ計数部は、前記第2の形式による丸め対象データの仮数部の最上位桁から連続するゼロ値を計数し、
前記指数生成部は、前記第2の形式による丸め対象データの指数部に1を増分した結果から、前記丸め精度と前記先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸めが行われる指数を表す丸め指数部を算出することを特徴とする請求項1又は2記載の演算回路。
【請求項4】
前記演算回路において、
前記第2の形式は、2進化10進法形式であることを特徴とする請求項3記載の演算回路。
【請求項5】
前記演算回路はさらに、
前記第1の出力レジスタに保持された丸め加算値を、前記第1の形式によるデータに変換する第2の変換部を有することを特徴とする請求項1乃至4のいずれか1項に記載の演算回路。
【請求項6】
前記演算回路はさらに、
前記第1の出力レジスタに保持された丸め加算値の最上位桁から連続するゼロ値を計数する第2の先行ゼロ計数部と、
前記仮数部の桁数に前記第1の出力レジスタに保持された丸め指数部を加算した結果から、前記第2のゼロ計数部が計数したゼロ値の数と前記第1の入力レジスタに保持された指数部を減算した、マスクを行なう桁を指定するマスク桁情報を算出するマスク桁情報算出部と、
前記マスク桁算出部が算出したマスク桁情報を用いて、オール1を表す所定値又はオール0を表す所定値のいずれかを所定幅毎に選択することにより、マスクデータを出力するマスクデータ生成部と、
前記第1の入力レジスタに保持された前記仮数部について、前記マスクデータ生成部が生成した複数のマスクデータを用いて、前記仮数部にマスクした結果を出力するマスク部を有することを特徴とする請求項1乃至5のいずれか1項に記載の演算回路。
【請求項7】
前記演算回路はさらに、
第1の出力レジスタに保持された丸め加算値と、丸めを行なう有効桁数に応じて丸めの際に加算される固定加算値を比較し、前記丸め加算値が前記固定加算値よりも大きい場合にエラーを検出するエラー検出部を有することを特徴とする請求項1乃至6のいずれか1項に記載の演算回路。
【請求項8】
丸め対象データの丸めを行なう演算回路と、前記演算回路の演算結果を丸める場合の丸め前処理を制御する丸め前処理命令をデコードする命令制御部とを有する演算処理装置において、
前記演算回路は、
N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、
前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタと、
前記命令制御部による前記丸め前処理命令のデコード結果に基づき、前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数する第1の先行ゼロ計数部と、
前記命令制御部による前記丸め前処理命令のデコード結果に基づき、前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出する指数生成部と、
前記指数生成部が生成した丸め指数部と、丸めを行う桁に加算される丸め加算値を保持する第1の出力レジスタを有することを特徴とする演算処理装置。
【請求項9】
前記演算処理装置はさらに、
前記命令制御部による前記丸め前処理命令のデコード結果に基づき、前記指数生成部が生成した丸め指数部に基づき、第1の丸め加算値と第2の丸め加算値のいずれかを選択して丸め加算値を出力する丸め加算値選択部を有することを特徴とする請求項8記載の演算処理装置。
【請求項10】
前記演算処理装置の演算回路はさらに、
前記第1の入力レジスタに保持された第1の形式による丸め対象データを第2の形式による丸め対象データに変換する第1の変換部を有し、
前記先行ゼロ計数部は、前記第2の形式による丸め対象データの仮数部の最上位桁から連続するゼロ値を計数し、
前記指数生成部は、前記第2の形式による丸め対象データの指数部に1を増分した結果から、前記丸め精度と前記先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸めが行われる指数を表す丸め指数部を算出することを特徴とする請求項8記載の演算処理装置。
【請求項11】
前記演算回路において、
前記第2の形式は、2進化10進法形式であることを特徴とする請求項10記載の演算処理装置。
【請求項12】
前記演算処理装置の演算回路はさらに、
前記第1の出力レジスタに保持された丸め加算値を、前記第1の形式によるデータに変換する第2の変換部を有することを特徴とする請求項8乃至11のいずれか1項に記載の演算処理装置。
【請求項13】
前記演算処理装置の命令制御部はさらに、
前記演算回路の演算結果を丸める丸め演算命令をデコードし、
前記演算処理装置の演算回路はさらに、
前記命令制御部による前記丸め演算命令のデコード結果に基づき、前記第1の出力レジスタに保持された丸め加算値の最上位桁から連続するゼロ値を計数する第2の先行ゼロ計数部と、
前記命令制御部による前記丸め演算命令のデコード結果に基づき、前記仮数部の桁数に前記第1の出力レジスタに保持された丸め指数部を加算した結果から、前記第2のゼロ計数部が計数したゼロ値の数と前記第1の入力レジスタに保持された指数部を減算した、マスクを行なう桁を指定するマスク桁情報を算出するマスク桁情報算出部と、
前記命令制御部による前記丸め演算命令のデコード結果に基づき、前記マスク桁算出部が算出したマスク桁情報を用いて、オール1を表す所定値又はオール0を表す所定値のいずれかを所定幅毎に選択することにより、マスクデータを出力するマスクデータ生成部と、
前記命令制御部による前記丸め演算命令のデコード結果に基づき、前記第1の入力レジスタに保持された前記仮数部について、前記マスクデータ生成部が生成した複数のマスクデータを用いて、前記仮数部にマスクした結果を出力するマスク部を有することを特徴とする請求項9乃至12のいずれか1項に記載の演算処理装置。
【請求項14】
前記演算処理装置の演算回路はさらに、
第1の出力レジスタに保持された丸め加算値と、丸めを行なう有効桁数に応じて丸めの際に加算される固定加算値を比較し、前記丸め加算値が前記固定加算値よりも大きい場合にエラーを検出するエラー検出部を有することを特徴とする請求項8乃至13のいずれか1項に記載の演算処理装置。
【請求項15】
N進法(Nは2以上の整数)による固定精度浮動小数点数の仮数部と、前記仮数部に対する指数を表す指数部を含む第1の形式の丸め対象データを保持する第1の入力レジスタと、前記丸め対象データに対する丸め処理の精度を表す丸め精度を保持する第2の入力レジスタとを有する丸め対象データの丸めを行なう演算回路の制御方法において、
前記演算回路が有する第1の先行ゼロ計数部が、前記第1の入力レジスタが保持した前記仮数部の最上位桁から連続するゼロ値を計数し、
前記演算回路が有する指数生成部が、前記指数部に1を増分した結果から、前記丸め精度と前記第1の先行ゼロ計数部が計数したゼロ値の数を減算することにより、丸め後の仮数に対応する指数を表す丸め指数部を算出して丸めを行う桁に加算される丸め加算値を出力することを特徴とする演算回路の制御方法。
【請求項16】
前記演算回路の制御方法はさらに、
前記演算回路が有する丸め加算値選択部が、前記指数生成部が生成した丸め指数部に基づき、第1の丸め加算値と第2の丸め加算値のいずれかを選択して丸め加算値を出力することを特徴とする請求項15記載の演算回路の制御方法。
【請求項17】
前記演算回路の制御方法はさらに、
前記演算回路が有する第2の先行ゼロ計数部が、前記第1の出力レジスタに保持された丸め加算値の最上位桁から連続するゼロ値を計数し、
前記演算回路が有するマスク桁情報算出部が、前記仮数部の桁数に前記前記第1の出力レジスタに保持された丸め指数部を加算した結果から、前記第2のゼロ計数部が計数したゼロ値の数と前記第1の入力レジスタに保持された指数部を減算した、マスクを行なう桁を指定するマスク桁情報を算出し、
前記演算回路が有するマスクデータ生成部が、前記マスク桁算出部が算出したマスク桁情報を用いて、オール1を表す第3の所定値又はオール0を表す所定値のいずれかを所定幅毎に選択することにより、マスクデータを出力し、
前記演算回路が有するマスク部が、前記第1の入力レジスタに保持された前記仮数部について、前記マスクデータ生成部が生成した複数のマスクデータを用いて、前記仮数部にマスクした結果を出力することを特徴とする請求項15記載の演算回路の制御方法。
【請求項18】
前記演算回路の制御方法はさらに、
前記演算回路が有するエラー検出部が、第1の出力レジスタに保持された丸め加算値と、前記丸めを行なう有効桁数に応じて丸めを行う際に加算される固定加算値を比較し、前記丸め加算値が前記固定加算値よりも大きい場合にエラーを検出することを特徴とする請求項15乃至17のいずれか1項に記載の演算回路の制御方法。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【図34】
【図35】
【図36】
【図37】
【図38】
【図39】
【図40】
【図41】
【図42】
【図43】
【図44】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【図34】
【図35】
【図36】
【図37】
【図38】
【図39】
【図40】
【図41】
【図42】
【図43】
【図44】
【公開番号】特開2012−221188(P2012−221188A)
【公開日】平成24年11月12日(2012.11.12)
【国際特許分類】
【出願番号】特願2011−85881(P2011−85881)
【出願日】平成23年4月8日(2011.4.8)
【出願人】(000005223)富士通株式会社 (25,993)
【公開日】平成24年11月12日(2012.11.12)
【国際特許分類】
【出願日】平成23年4月8日(2011.4.8)
【出願人】(000005223)富士通株式会社 (25,993)
[ Back to top ]