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