(57)【要約】【課題】  より正確な浮動小数点を用いた演算を行うこと。【解決手段】  乗算対象である第１の数と第２の数との積の演算を、二進浮動小数点を用いて行う演算装置であって、前記第１の数、前記第２の数、および、演算によって発生した数を、所定の桁数より下位の桁のビットを切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、前記記憶部に記憶された前記第１の数を１のビットの最上位桁と最下位桁が分かれるように２つ以上の数に分離し、前記分離したそれぞれの数と前記第２の数の積の演算を行い、それぞれの当該演算結果を別々に前記記憶部に記憶させる処理部と、を有することを特徴とする。【選択図】      図２
2006302180.tif 000002
【特許請求の範囲】
【請求項１】
乗算対象である第１の数と第２の数との積の演算を、二進浮動小数点を用いて行う演算装置であって、
前記第１の数、前記第２の数、および、演算によって発生した数を、所定の桁数より下位の桁のビットを切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、
前記記憶部に記憶された前記第１の数を１のビットの最上位桁と最下位桁が分かれるように２つ以上の数に分離し、前記分離したそれぞれの数と前記第２の数の積の演算を行い、それぞれの当該演算結果を別々に前記記憶部に記憶させる処理部と、
を有することを特徴とする演算装置。
【請求項２】
加算対象である第１の数と第２の数との和の演算を、二進浮動小数点を用いて行う演算装置であって、
前記第１の数、前記第２の数、および、演算によって発生した数を、所定の桁数より下位の桁のビットを切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、
前記記憶部に記憶された前記第１の数と前記第２の数の和を第３の数とし、前記第３の数と前記第１の数の差を第４の数とし、前記第２の数と前記第４の数の差を第５の数とし、前記第３の数と前記第５の数を前記第１の数と前記第２の数の和として別々に前記記憶部に記憶させる処理部と、
を有することを特徴とする演算装置。
【請求項３】
請求項１に記載の演算装置と請求項２に記載の演算装置とを組み合わせることにより、乗算と加算とからなる内積演算を行うことを特徴とする演算装置。
【請求項４】
乗算対象である第１の数と第２の数との積の演算を、二進浮動小数点を用いて行う演算装置におけるコンピュータの演算方法であって、
前記演算装置は、前記第１の数、前記第２の数、および、演算によって発生した数を、所定の桁数より下位の桁のビットを切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、処理部とを備えるとともに、
前記処理部は、前記記憶部に記憶された前記第１の数を１のビットの最上位桁と最下位桁が分かれるように２つ以上の数に分離し、前記分離したそれぞれの数と前記第２の数の積の演算を行い、それぞれの当該演算結果を別々に前記記憶部に記憶させる
ことを特徴とする演算方法。
【請求項５】
加算対象である第１の数と第２の数との和の演算を、二進浮動小数点を用いて行う演算装置におけるコンピュータの演算方法であって、
前記演算装置は、前記第１の数、前記第２の数、および、演算によって発生した数を、所定の桁数より下位の桁のビットを切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、処理部を備えるとともに、
前記処理部は、前記記憶部に記憶された前記第１の数と前記第２の数の和を第３の数とし、前記第３の数と前記第１の数の差を第４の数とし、前記第２の数と前記第４の数の差を第５の数とし、前記第３の数と前記第５の数を前記第１の数と前記第２の数の和として別々に前記記憶部に記憶させる
ことを特徴とする演算方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、浮動小数点を用いた演算を行う演算装置および演算方法に関する。
【背景技術】
【０００２】
一般に、コンピュータなどの演算装置において、乗算、加算などの演算を行う場合、二進数で表現された数値について、所定の桁の切り捨てあるいは切り上げを行いながら、演算を実行することになる。
【０００３】
たとえば、ＩＥＥＥ（Institute of Electrical and Electronic Engineers）７５４では、単精度、倍精度という二進浮動小数点形式を規定している。単精度とは、１つの数値を３２ビット（符号部１ビット・指数部８ビット・仮数部２３ビット）で表現するものであり、倍精度とは、１つの数値を６４ビット（符号部１ビット・指数部１１ビット・仮数部５２ビット）で表現するものである。
そして、これら単精度および倍精度の拡張形式が演算に用いられる場合もある。
【０００４】
このように、ＩＥＥＥ７５４では浮動小数点形式が規定されているが、これらの浮動小数点数を用いたコンピュータにおける内積演算では、丸め、情報落ち及び桁落ちの誤差が生じるため、正確な内積演算結果が得られない、という問題がある。
そこで、内積演算の精度を改善するものとして、いくつかの装置が提案されている。
【０００５】
たとえば、特許文献１では、入力ベクトルxに対し、全てのベクトル成分からスカラー数βを減じた後、スカラー数α倍したα(x-βI)なる変換を施してから内積演算を行う装置が開示されている。
【０００６】
また、特許文献２では、複数の入力データに対応するビットスライスに基づいて、ルックアップテーブルから該ビットスライスの数値配列に対応する部分内積を検出して出力し、該部分内積を初期値あるいは中間累積値に対して加算して加算出力値を出力し、該加算出力値の下位側切捨てビットの数値を保持し、上記加算処理を入力データの桁数分に対応するサイクルを繰り返して得られる最終累算結果の値に最終加算サイクルから所定サイクル前までの上記切捨てビットの数値を付加することにより、演算精度の劣化を改善する演算装置が開示されている。
【特許文献１】特開平１１−９６１４０号公報（段落００１４〜段落００３１、図３）
【特許文献２】特開２０００−１３２５３９号公報（段落００６６〜段落００７３、図１）
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、特許文献１、特許文献２ではいずれも、ハードウェアによる内積演算の精度改善方式が採用されていて、ハードウェアの設計段階で桁数に制限が設けられるため、ＩＥＥＥ７５４に準拠している任意の浮動小数点を用いた内積演算において、丸め、情報落ち及び桁落ちの誤差が少なからず生じることがあり、正確な演算結果が得られないという問題点があった。
そこで、本発明は、前記問題点に鑑みてなされたものであり、より正確な浮動小数点を用いた演算を行うことを目的とする。
【課題を解決するための手段】
【０００８】
前記課題を解決するために、本発明に係る演算装置は、乗算対象である第１の数と第２の数との積の演算を、二進浮動小数点を用いて行う演算装置であって、前記第１の数、前記第２の数、および、演算によって発生した数を、所定の桁数より下位の桁のビットを切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、前記記憶部に記憶された前記第１の数を１のビットの最上位桁と最下位桁が分かれるように２つ以上の数に分離し、前記分離したそれぞれの数と前記第２の数の積の演算を行い、それぞれの当該演算結果を別々に前記記憶部に記憶させる処理部と、を有することを特徴とする。その他の手段については、後記する。
【発明の効果】
【０００９】
本発明によれば、より正確な浮動小数点を用いた演算を行うことができる。
【発明を実施するための最良の形態】
【００１０】
以下、本発明に係るデータ処理装置（演算装置）について、適宜図面を参照しながら説明する。
【００１１】
まず、図１を参照しながら、データ処理装置の構成について説明する。図１は、データ処理装置の構成図である。
データ処理装置１は、補助記憶部１０１、メモリ（記憶部）１０２、処理部としてのＣＰＵ（Central Processing Unit）１０３、入力部１０４、出力部１０５および入出力インタフェース１０６を備えて構成される。
【００１２】
補助記憶部１０１は、各種情報を記憶するものであり、たとえば、ハードディスク、ＲＯＭ（Read Only Memory）などにより実現される。補助記憶部１０１は、ここでは、プログラム１１１、コンパイラ１１２および実行モジュール１１３を記憶している。
【００１３】
プログラム１１１は、図２で示すフローチャート上の処理が記述されているプログラム（以下、ソースプログラムという）である。
コンパイラ１１２は、プログラム１１１をコンパイル・リンクするものである。
実行モジュール１１３は、コンパイラ１１２によってコンパイル・リンクされたモジュールである。
【００１４】
メモリ１０２は、各種情報を記憶する一時記憶手段であり、たとえば、ＲＡＭ（Random Access Memory）により実現される。
ＣＰＵ１０３は、各種演算処理を行うものであり、メモリ１０２、入出力インタフェース１０６を介して実行モジュール１１３を実行する役割を果たす。
入力部１０４は、各種実行コマンドなどを入力する入力装置である。
出力部１０５は、各種実行結果などを出力する出力装置である。
入出力インタフェース１０６は、図１に示すように、各構成間の入出力のインタフェースの役割を果たすものである。
【００１５】
そして、前記のように構成されるデータ処理装置１は、次のように動作する。
まず、操作者により入力部１０４から入力されたコンパイルコマンドは、入出力インタフェース１０６を介して、メモリ１０２にストアされる。メモリ１０２では、補助記憶部１０１のプログラム１１１が、コンパイラ１１２によってコンパイル・リンクされ、機械語コードである実行モジュール１１３が生成される。
【００１６】
次に、操作者により入力部１０４から実行コマンドが入力されると、ＣＰＵ１０３がメモリ１０２に実行モジュール１１３をロードする。実行モジュール１１３がメモリ１０２にロードされると、ＣＰＵ１０３によって、図２に示すフローチャート上の各処理Ｓ２０１〜Ｓ２０８がメモリ１０２からＣＰＵ１０３に逐次呼び出され、各処理が実行された後、その実行結果がメモリ１０２にストアされる。
メモリ１０２にストアされた実行結果は、ＣＰＵ１０３によって、入出力インターフェイス１０６を介して、出力部１０５に出力される。
【００１７】
続いて、図２を参照しながら、データ処理装置の処理について説明する（適宜図１参照）。図２は、データ処理装置の全体的な処理を示したフローチャートである。ここでは、i＝Ｎ次元での内積演算のベクトルＡ（i）、Ｂ（i）の精度改善を行う場合を例にして説明する。
【００１８】
まず、入力処理Ｓ２０１が、メモリ１０２からＣＰＵ１０３に呼び出される。この入力処理Ｓ２０１では、図３に示すように、ＣＰＵ１０３が、Ｓ３０１からＳ３０３までの処理を繰り返し、操作者により入力部１０４から入力されたi＝Ｎ次元のデータ、すなわち、Ａ（i）、Ｂ（i）を、メモリ１０２にロードさせる。
【００１９】
図２に戻って、次に、初期化処理Ｓ２０２がメモリ１０２からＣＰＵ１０３に呼び出される。この初期化処理Ｓ２０２では、図４に示すように、Ｓ４０１において、ＣＰＵ１０３が、変数であるＳＵＭおよびＤＳＵＭの領域をメモリ１０２上に確保し、ＳＵＭおよびＤＳＵＭの値をそれぞれ０に初期化する。
【００２０】
ＳＵＭは、最終的な誤差の補正がされていない和を代入する変数であり、ＤＳＵＭは、誤差の補正部分を代入する変数である。
このようなＳＵＭ、ＤＳＵＭを用いることにより、データ処理装置１において数値の乗算や加算などの演算を行う場合、次のような効果がある。すなわち、メモリ１０２やＣＰＵ１０３が記憶（保持）できる桁数が決まっているので、それによる数値のずれを誤差として記憶し、その後の演算においてもその誤差を使用することで、演算全体の誤差を減らしたり、なくしたりすることが可能となる。
【００２１】
次に、図２の処理Ｓ２０３〜Ｓ２０６において、ベクトルのＮ次元数分の繰返し処理、すなわち、内積の演算処理を行う。たとえば、２次元の場合はＮ＝２とし、その場合、Ａ（i）、Ｂ（i）は、それぞれＡ(Ａ（１）,Ａ（２）)、Ｂ(Ｂ（１）,Ｂ（２）)と表現することとする。
【００２２】
具体的には、まず、ＣＰＵ１０３は、i＝ＮのときのＡ（ｉ）＊Ｂ（i）における誤差を補正する（Ｓ２０４）。次に、ＣＰＵ１０３は、i＝ＮのときのΣＡ（ｉ）＊Ｂ（i）における誤差を補正する（Ｓ２０５）。
【００２３】
図５は、図２に示したＳ２０４の詳細図である。まず、Ｓ５０１において、ＣＰＵ１０３は、変数Ａ（i）、Ａ１（ｉ）、Ａ２（ｉ）、Ｂ（ｉ）、Ｂ１（ｉ）およびＢ２（ｉ）の領域を、メモリ１０２上に確保する。
そして、ＣＰＵ１０３は、Ａ（ｉ）を、１のビットの最上位桁と最下位桁が分かれるようにＡ１（ｉ）とＡ２（ｉ）に分離する。
【００２４】
また、ＣＰＵ１０３は、Ｂ（ｉ）についても同様に、１のビットの最上位桁と最下位桁が分かれるようにＢ（ｉ）とＢ２（ｉ）に分離する。
なお、この分離は、Ａ（ｉ），Ｂ（ｉ）のいずれかのみに行うようにしてもよい。
【００２５】
Ｓ５０２において、ＣＰＵ１０３は、変数Ｓ１、Ｓ２、Ｓ３およびＳ４の領域を、メモリ１０２上に確保し、Ａ１（ｉ）＊Ｂ１（ｉ）をＳ１、Ａ１（ｉ）＊Ｂ２（ｉ）をＳ２、Ａ２（ｉ）＊Ｂ１（ｉ）をＳ３、Ａ２（ｉ）＊Ｂ２（ｉ）をＳ４にそれぞれ代入する。
これにより、Ａ（ｉ）＊Ｂ（ｉ）は、Ｓ１＋Ｓ２＋Ｓ３＋Ｓ４で表現されることとなる。
【００２６】
Ｓ５０３において、ＣＰＵ１０３は、変数Ｔ１、Ｔ２の領域をメモリ１０２上に確保し、前記したＳ１とＳ２の和をＴ１に代入する。また、Ｓ１とＳ２の和の誤差をＳ２-(Ｔ１-Ｓ１)から計算し、Ｔ２に代入する。
これにより、和Ｓ１＋Ｓ２で生じた丸めや情報落ちによる誤差をフォローすることができる。
【００２７】
Ｓ５０４において、ＣＰＵ１０３は、変数Ｔ３、Ｔ４の領域をメモリ１０２上に確保し、前記したＳ３とＳ４の和をＴ３に代入する。また、Ｓ３とＳ４の和の誤差をＳ４-(Ｔ３-Ｓ３)から計算し、Ｔ４に代入する。
これにより、和Ｓ３＋Ｓ４で生じた丸めや情報落ちによる誤差をフォローすることができる。
【００２８】
Ｓ５０５において、ＣＰＵ１０３は、変数Ｔ５、Ｔ６の領域をメモリ１０２上に確保し、前記したＴ１とＴ３の和をＴ５に代入する。また、Ｔ１とＴ３の和の誤差をＴ３-(Ｔ５-Ｔ１)から計算し、Ｔ６に代入する。
これにより、和Ｔ１＋Ｔ３で生じた丸めや情報落ちによる誤差をフォローすることができる。
【００２９】
Ｓ５０６において、ＣＰＵ１０３は、変数Ｔ７の領域をメモリ１０２上に確保し、前記したＴ２とＴ４とＴ６の和をＴ７に代入する。
なお、このＴ７は、大きな誤差を生じる可能性が少ないので、その誤差についてフォローしなくても問題はない。
【００３０】
Ｓ５０７において、ＣＰＵ１０３は、変数Ｄ、Ｅの領域をメモリ１０２上に確保し、前記したＴ５とＴ７の和をＤに代入する。また、Ｔ５とＴ７の和の誤差をＴ７-(Ｄ-Ｔ５)から計算し、Ｅに代入する。
このように、ＣＰＵ１０３は、与えられたすべてのiについて、Ｓ５０１〜Ｓ５０７の処理を行う。
【００３１】
図６は、図２に示したＳ２０５の詳細図である。なお、図６のＳ６０１〜Ｓ６０５は、図５のＳ５０３〜Ｓ５０７と同様の処理である。
【００３２】
Ｓ６０１において、ＣＰＵ１０３は、変数Ｓ１１、Ｓ１２の領域をメモリ１０２上に確保し、前記したＳＵＭとＤの和をＳ１１に代入する。また、ＳＵＭとＤの和の誤差をＳ１２に代入する。
【００３３】
Ｓ６０２において、ＣＰＵ１０３は、変数Ｓ１３、Ｓ１４の領域をメモリ１０２上に確保し、前記したＤＳＵＭとＥの和をＳ１３に代入する。また、ＤＳＵＭとＥの和の誤差をＳ１４に代入する。
【００３４】
Ｓ６０３において、ＣＰＵ１０３は、変数Ｓ１５、Ｓ１６の領域をメモリ１０２上に確保し、前記したＳ１１とＳ１３の和をＳ１５に代入する。また、Ｓ１１とＳ１３の和の誤差をＳ１６に代入する。
【００３５】
Ｓ６０４において、ＣＰＵ１０３は、変数Ｓ１７の領域をメモリ１０２上に確保し、前記したＳ１２とＳ１４とＳ１６の和をＳ１７に代入する。
【００３６】
Ｓ６０５において、ＣＰＵ１０３は、前記したＳ１５とＳ１７の和をＳＵＭに代入し、Ｓ１５とＳ１７の和の誤差をＤＳＵＭに代入する。
このように、ＣＰＵ１０３は、与えられたすべてのiについて、Ｓ６０１〜Ｓ６０５の処理を行う。
【００３７】
図２に戻り、Ｓ２０７において、ＣＰＵ１０３は、ＳＵＭと補正項ＤＳＵＭの和を演算し、ＳＵＭに代入する。
Ｓ２０８において、ＣＰＵ１０３は、出力処理として、Ｓ２０７で代入したＳＵＭの値を演算結果として出力部１０５に出力する。
【００３８】
このように、Ｓ２０１〜Ｓ２０８の各処理を行うことで、内積演算Ａ・Ｂについての正確な演算結果を得ることができる。
また、このように正確な演算結果を得ることにより、高精度の内積計算を必要とする産業（例えば、ニューラルネットワーク、ベクトル量子化、敏感な数値シミュレーションを必要とする物理学分野）に本発明を応用することができる。
【００３９】
続いて、前記した内積演算の具体例について説明する（適宜各図参照）。なお、ここでは、理解を容易にするため、２次元ベクトルに関する内積演算の場合を例にとり説明する。また、データ処理装置１（図１参照）が各演算で使用する数値について、仮数部として保持できる桁数を８ビットとする（指数部を除く）。そして、演算結果の数値が８ビットを超えた場合、上位８ビットのみを保持し、残りのビットは切り捨てるものとする。
【００４０】
前記条件のもとで、２次元ベクトルＡ及びＢを次のように設定する。
Ａ＝(Ａ（１），Ａ（２）)、Ｂ＝(Ｂ（１），Ｂ（２）)
Ａ（１）、Ａ（２）、Ｂ（１）、Ｂ（２）は、二進数であり、それぞれの値は、次の通りである。
Ａ（１）＝１０１１０１１１（十進数表記で「１８３」：以下同様に、かっこ内は十進数表記）
Ａ（２）＝１００１０１０１（１４９）
Ｂ（１）＝１１０１１０１０（２１８）
Ｂ（２）＝１１１０００１１（２２７）
【００４１】
前記条件のとき、内積演算Ａ・Ｂの正確な答えであるＡ・Ｂ（正解）は、次のようになる。
Ａ・Ｂ（正解）＝１００１１０１１１１０１０１１０（３９８９４）＋
１００００１０００００１１１１１（３３８２３）
＝１０００１１１１１１１１１０１０１（７３７１７）
【００４２】
そして、本実施形態のデータ処理装置１（図１参照）を用いない場合、すなわち、従来のように切り捨てによって生じた誤差を補正しない場合、内積演算Ａ・Ｂの結果であるＡ・Ｂ（従来）は、次のようになる。
Ａ・Ｂ（従来）＝１００１１０１１*２8（３９６８０）＋
１００００１００*２8（３３７９２）
＝１０００１１１１*２9（７３２１６）
【００４３】
つまり、従来の演算方式では、７３７１７−７３２１６＝５０１の誤差が生じてしまう。
【００４４】
次に、前記条件のときに、本実施形態のデータ処理装置１（図１参照）を用いて、内積演算Ａ・Ｂの結果であるＡ・Ｂ（本願）を算出する演算について説明する（適宜各図参照）。
【００４５】
まず、Ｓ２０１において、Ｓ３０１に示すように、入力部１０４からデータを入力する。その結果、以下のように配列が初期化される。
Ａ（１）＝１０１１０１１１（１８３）
Ａ（２）＝１００１０１０１（１４９）
Ｂ（１）＝１１０１１０１０（２１８）
Ｂ（２）＝１１１０００１１（２２７）
【００４６】
次に、Ｓ２０２において、ＣＰＵ１０３は、変数ＳＵＭ、ＤＳＵＭのＳ４０１に示すように、変数ＳＵＭ及びＤＳＵＭの値を０に初期化する。
また、この例では２次元での内積演算を実施するため、Ｓ２０３における変数Ｎを２に初期化する。
【００４７】
そして、Ｓ２０２が実行された後、i＝１としてＳ２０４が実行される。次に、積Ａ(１)*Ｂ(１)における誤差を補正するために、Ｓ５０１において、ＣＰＵ１０３は、ベクトル成分を以下のように分離する。
Ａ（１）＝Ａ１(１)＋Ａ２(１)
Ｂ（１）＝Ｂ１(１)＋Ｂ２(１)
Ａ１(１)＝１０１１００００（１７６）
Ａ２(１)＝０００００１１１（７）
Ｂ１(１)＝１１０１００００（２０８）
Ｂ２(１)＝００００１０１０（１０）
【００４８】
なお、ここでは、Ａ(１)およびＢ(１)の各々について、Ａ１(１)およびＢ１(１)のそれぞれ下４桁が０になるように分離したが、下３桁や下２桁などが０になるように分離してもよい。また、Ａ(１)およびＢ(１)のいずれかだけを分離するようにしてもよい。
いずれにしても、このように、Ａ(１)およびＢ(１)を、１のビットの最上位桁と最下位桁が分かれるように２つ以上の数に分離することで、以下の演算における誤差を少なくすることができるのである。
【００４９】
そして、Ｓ５０１が実行された後、Ｓ５０２において、変数Ｓ１、Ｓ２、Ｓ３、Ｓ４は以下のようになる。
Ｓ１＝１０００１１１１＊２8（３６６０８）
Ｓ２＝１１０１１１００＊２3（１７６０）
Ｓ３＝１０１１０１１０＊２3（１４５６）
Ｓ４＝０１０００１１０（７０）
【００５０】
Ｓ５０２が実行された後、Ｓ５０３において、変数Ｔ１、Ｔ２は以下のようになる。
Ｔ１＝１００１０１０１＊２8（３８１４４）
Ｔ２＝１１１０００００（２２４）
【００５１】
また、Ｓ５０４において、変数Ｔ３、Ｔ４は以下のようになる。
Ｔ３＝１０１１１１１０＊２3（１５２０）
Ｔ４＝０００００１１０（６）
【００５２】
さらに、Ｓ５０５において、変数Ｔ５、Ｔ６は以下のようになる。
Ｔ５＝１００１１０１０＊２8（３９４２４）
Ｔ６＝１１１１００００（２４０）
【００５３】
また、Ｓ５０６において、変数Ｔ７は以下のようになる。
Ｔ７＝１１１０１０１１＊２1（４７０）
【００５４】
さらに、Ｓ５０７において、変数Ｄ、Ｅは以下のようになる。
Ｄ＝１００１１０１１＊２8（３９６８０）
Ｅ＝１１０１０１１０（２１４）
【００５５】
続いて、i＝１としてＳ２０５が実行される。なお、ここでは、ＳＵＭとＤＳＵＭは初期値のままであるので、ともに０である。
【００５６】
まず、Ｓ６０１において、変数Ｓ１１、Ｓ１２は以下のようになる。
Ｓ１１＝１００１１０１１＊２8（３９６８０）
Ｓ１２＝０００００００００（０）
【００５７】
また、Ｓ６０２において、変数Ｓ１３、Ｓ１４は以下のようになる。
Ｓ１３＝１１０１０１１０（２１４）
Ｓ１４＝００００００００（０）
【００５８】
さらに、Ｓ６０３において、変数Ｓ１５、Ｓ１６は以下のようになる。
Ｓ１５＝１００１１０１１＊２8（３９６８０）
Ｓ１６＝１１０１０１１０（２１４）
【００５９】
また、Ｓ６０４において、変数Ｓ１７は以下のようになる。
Ｓ１７＝１１０１０１１０（２１４）
【００６０】
そして、Ｓ６０５において、変数ＳＵＭ、ＤＳＵＭは以下のようになる。
ＳＵＭ＝１００１１０１１＊２8（３９６８０）
ＤＳＵＭ＝１１０１０１１０（２１４）
【００６１】
次に、i＝２としてＳ２０４が実行される。まず、積Ａ(２)*Ｂ(２)における誤差を補正するために、Ｓ５０１において、ベクトル成分を以下のように分離する。
Ａ（２）＝Ａ１（２）＋Ａ２（２）
Ｂ（２）＝Ｂ１（２）＋Ｂ２（２）
Ａ１（２）＝１００１００００（１４４）
Ａ２（２）＝０００００１０１（５）
Ｂ１（２）＝１１１０００００（２２５）
Ｂ２（２）＝００００００１１（３）
【００６２】
そして、Ｓ５０１が実行された後、Ｓ５０２において、変数Ｓ１、Ｓ２、Ｓ３、Ｓ４は以下のようになる。
Ｓ１＝１１１１１１００＊２7（３２２５６）
Ｓ２＝１１０１１０００＊２1（４３２）
Ｓ３＝１０００１１００＊２3（１１２０）
Ｓ４＝００００１１１１（１５）
【００６３】
Ｓ５０２が実行された後、Ｓ５０３において、変数Ｔ１、Ｔ２は以下のようになる。
Ｔ１＝１１１１１１１１＊２7（３２６４０）
Ｔ２＝００１１００００（４８）
【００６４】
また、Ｓ５０４において、変数Ｔ３、Ｔ４は以下のようになる。
Ｔ３＝１０００１１０１＊２3（１１２８）
Ｔ４＝０００００１１０（７）
【００６５】
さらに、Ｓ５０５において、変数Ｔ５、Ｔ６は以下のようになる。
Ｔ５＝１０００００１１＊２8（３３５３６）
Ｔ６＝１１１０１０００（２３２）
【００６６】
また、Ｓ５０６において、変数Ｔ７は以下のようになる。
Ｔ７＝１０００１１１１＊２1（２８６）
【００６７】
さらに、Ｓ５０７において、変数Ｄ、Ｅは以下のようになる。
Ｄ＝１００００１００＊２8（３３７９２）
Ｅ＝０００１１１１０（３０）
【００６８】
続いて、i＝２としてＳ２０５が実行される。なお、ここでは、ＳＵＭとＤＳＵＭの値は、次のようになっている。
ＳＵＭ＝１００１１０１１＊２8（３９６８０）
ＤＳＵＭ＝１１０１０１１０（２１４）
【００６９】
まず、Ｓ６０１において、変数Ｓ１１、Ｓ１２は以下のようになる。
Ｓ１１＝１０００１１１１＊２9（７３２１６）
Ｓ１２＝１０００００００＊２1（２５６）
【００７０】
また、Ｓ６０２において、変数Ｓ１３、Ｓ１４は以下のようになる。
Ｓ１３＝１１１１０１００（２４４）
Ｓ１４＝００００００００（０）
【００７１】
さらに、Ｓ６０３において、変数Ｓ１５、Ｓ１６は以下のようになる。
Ｓ１５＝１０００１１１１＊２9（７３２１６）
Ｓ１６＝１１１１０１００（２４４）
【００７２】
また、Ｓ６０４において、変数Ｓ１７は以下のようになる。
Ｓ１７＝１１１１１０１０＊２1（５００）
【００７３】
そして、Ｓ６０５において、変数ＳＵＭ、ＤＳＵＭは以下のようになる。
ＳＵＭ＝１０００１１１１＊２9（７３２１６）
ＤＳＵＭ＝１１１１１０１０＊２1（５００）
【００７４】
最後に、Ｓ２０７において、ＣＰＵ１０３は、ＳＵＭ＋ＤＳＵＭをＳＵＭに代入し、ＳＵＭ＝７３７１６を得る。
なお、Ｓ２０７においては、実際には、ＳＵＭの値とＤＳＵＭの値を別々にメモリ１０２に記憶するので、丸め誤差などが生じることはない。
【００７５】
そして、出力処理Ｓ２０８において、ＣＰＵ１０３は、演算結果、すなわち、Ａ・Ｂ（本願）＝１０００１１１１１１１１１０１００（７３７１６）を出力する。
【００７６】
つまり、Ａ・Ｂ（正解）、Ａ・Ｂ（従来）およびＡ・Ｂ（本願）の演算結果の十進数表記を並べて記載すると、次のようになり、Ａ・Ｂ（本願）の誤差がＡ・Ｂ（従来）の誤差に比べて、極めて小さくなることがわかる。
Ａ・Ｂ（正解）＝７３７１７
Ａ・Ｂ（従来）＝７３２１６（誤差５０１）
Ａ・Ｂ（本願）＝７３７１６（誤差１）
【００７７】
具体的な別の例として、ＩＥＥＥ７５４で規定された倍精度形式を用いた３次元での内積演算Ａ・Ｂにおける精度改善処理を以下に示す。なお、以下の例では、数値は十進数表記とする。
３次元ベクトルＡ及びＢを以下のように設定するとき、内積演算Ａ・Ｂ（正解）は以下のようになる。
Ａ=(a00,a01,a02)、Ｂ=(b00,b10,b20)
a00=1738663799
a01=773694423
a02=112614455
b00=1506009561
b10=2117293945
b20=421597465
Ａ・Ｂ（正解）=a00*b00+a01*b10+a02*b20=4304060790507107549
【００７８】
まず、上記の条件で本発明を用いない場合、すなわち、丸め、情報落ち及び桁落ちで生じた誤差を補正しない場合、内積演算Ａ・Ｂ（従来）は以下に示すような結果となる。
Ａ・Ｂ（従来）=0.43040607905071073*1019
【００７９】
一方、上記の条件で、本発明を用いた場合、以下に示すような結果となる。まず、入力処理Ｓ２０１により、Ｓ３０１のように、入力装置１０４からデータを入力する。その結果、以下のように配列が初期化される。
Ａ（１）=1738663799
Ａ（２）=773694423
Ａ（３）=112614455
Ｂ（１）=1506009561
Ｂ（２）=2117293945
Ｂ（３）=421597465
【００８０】
次に、初期化処理Ｓ２０２により、変数ＳＵＭ、Ｓ４０１のように、変数ＳＵＭ及びＤＳＵＭを０に初期化する。また、今回の例では３次元での内積演算を実施するため、Ｓ２０３における変数Ｎを３に初期化する。
【００８１】
初期化処理が実行された後、i＝１としてＳ２０４処理が実行される。まず、積Ａ（１）*Ｂ（１）における誤差を補正するために、Ｓ５０１により、ベクトル成分を以下のように分離する。なお、ここで、Dは十進数であることを示し、変数Ｄとは無関係である。また、右辺の末尾の２桁の数は、１０を底とする指数の指数部を示す。
Ａ1（１）=0.173866377600000000000000000000D+10
Ａ2（１）=0.230000000000000000000000000000D+02
Ｂ1（１）=0.150600953600000000000000000000D+10
Ｂ2（１）=0.250000000000000000000000000000D+02
【００８２】
Ｓ５０１が実行された後、Ｓ５０２により、変数Ｓ１、Ｓ２、Ｓ３、Ｓ４は以下のようになる。
Ｓ１=0.261844422655376793600000000000D+19
Ｓ２=0.434665944000000000000000000000D+11
Ｓ３=0.346382193280000000000000000000D+11
Ｓ４=0.575000000000000000000000000000D+03
【００８３】
Ｓ５０２が実行された後、Ｓ５０３により、変数Ｔ１、Ｔ２は以下のようになる。
Ｔ１=0.261844427002036224000000000000D+19
Ｔ２=0.960000000000000000000000000000D+02
【００８４】
Ｓ５０３が実行された後、Ｓ５０４により、変数Ｔ３、Ｔ４は以下のようになる。
Ｔ３=0.346382199030000000000000000000D+11
Ｔ４=0.000000000000000000000000000000D+00
【００８５】
Ｓ５０４が実行された後、Ｓ５０５により、変数Ｔ５、Ｔ６は以下のようになる。
Ｔ５=0.261844430465858201600000000000D+19
Ｔ６=0.127000000000000000000000000000D+03
【００８６】
Ｓ５０５が実行された後、Ｓ５０６により、変数Ｔ７は以下のようになる。
Ｔ７=0.223000000000000000000000000000D+03
【００８７】
Ｓ５０６が実行された後、Ｓ５０７により、変数Ｄ、Ｅは以下のようになる。
Ｄ=0.261844430465858201600000000000D+19
Ｅ=0.223000000000000000000000000000D+03
【００８８】
i＝１としてＳ２０４が実行された後、次にi＝１としてＳ２０５が実行される。
まず、Ｓ６０１により、変数Ｓ１１、Ｓ１２は以下のようになる。
Ｓ１１=0.261844430465858201600000000000D+19
Ｓ１２=0.000000000000000000000000000000D+00
【００８９】
Ｓ６０１が実行された後、Ｓ６０２により、変数Ｓ１３、Ｓ１４は以下のようになる。
Ｓ１３=0.223000000000000000000000000000D+03
Ｓ１４=0.000000000000000000000000000000D+00
【００９０】
Ｓ６０２が実行された後、Ｓ６０３により、変数Ｓ１５、Ｓ１６は以下のようになる。
Ｓ１５=0.261844430465858201600000000000D+19
Ｓ１６=0.223000000000000000000000000000D+03
【００９１】
Ｓ６０３が実行された後、Ｓ６０４により、変数Ｓ１７は以下のようになる。
Ｓ１７=0.223000000000000000000000000000D+03
【００９２】
Ｓ６０４が実行された後、Ｓ６０５により、変数ＳＵＭ、ＤＳＵＭは以下のようになる。
ＳＵＭ= 0.261844430465858201600000000000D+19
ＤＳＵＭ=0.223000000000000000000000000000D+03
【００９３】
i＝１としてＳ２０５が実行された後、i＝２としてＳ２０４処理が実行される。まず、積Ａ（２）*Ｂ（２）における誤差を補正するために、Ｓ５０１により、ベクトル成分を以下のように分離する。
Ａ1（２）=0.773694416000000000000000000000D+09
Ａ2（２）=0.700000000000000000000000000000D+01
Ｂ1（２）=0.211729392000000000000000000000D+10
Ｂ2（２）=0.250000000000000000000000000000D+02
【００９４】
Ｓ５０１が実行された後、Ｓ５０２により、変数Ｓ１、Ｓ２、Ｓ３、Ｓ４は以下のようになる。
Ｓ１=0.163813848293475072000000000000D+19
Ｓ２=0.193423604000000000000000000000D+11
Ｓ３=0.148210574400000000000000000000D+11
Ｓ４=0.175000000000000000000000000000D+03
【００９５】
Ｓ５０２が実行された後、Ｓ５０３により、変数Ｔ１、Ｔ２は以下のようになる。
Ｔ１=0.163813850227711104000000000000D+19
Ｔ２=0.800000000000000000000000000000D+02
【００９６】
Ｓ５０３が実行された後、Ｓ５０４により、変数Ｔ３、Ｔ４は以下のようになる。
Ｔ３=0.346382199030000000000000000000D+11
Ｔ４=0.000000000000000000000000000000D+00
【００９７】
Ｓ５０４が実行された後、Ｓ５０５により、変数Ｔ５、Ｔ６は以下のようになる。
Ｔ５=0.163813851709816857600000000000D+19
Ｔ６=0.790000000000000000000000000000D+02
【００９８】
Ｓ５０５が実行された後、Ｓ５０６により、変数Ｔ７は以下のようになる。
Ｔ７=0.159000000000000000000000000000D+03
【００９９】
Ｓ５０６が実行された後、Ｓ５０７により、変数Ｄ、Ｅは以下のようになる。
Ｄ=0.163813851709816883200000000000D+19
Ｅ=-0.970000000000000000000000000000D+02
【０１００】
i＝２としてＳ２０４が実行された後、次にi＝２としてＳ２０５が実行される。まず、Ｓ６０１により、変数Ｓ１１、Ｓ１２は以下のようになる。
Ｓ１１=0.425658282175675084800000000000D+19
Ｓ１２=0.000000000000000000000000000000D+00
【０１０１】
Ｓ６０１が実行された後、Ｓ６０２により、変数Ｓ１３、Ｓ１４は以下のようになる。
Ｓ１３=0.126000000000000000000000000000D+03
Ｓ１４=0.000000000000000000000000000000D+00
【０１０２】
Ｓ６０２が実行された後、Ｓ６０３により、変数Ｓ１５、Ｓ１６は以下のようになる。
Ｓ１５=0.425658282175675084800000000000D+19
Ｓ１６=0.126000000000000000000000000000D+03
【０１０３】
Ｓ６０３が実行された後、Ｓ６０４により、変数Ｓ１７は以下のようになる。
Ｓ１７=0.126000000000000000000000000000D+03
【０１０４】
Ｓ６０４が実行された後、Ｓ６０５により、変数ＳＵＭ、ＤＳＵＭは以下のようになる。
ＳＵＭ= 0.425658282175675084800000000000D+19
ＤＳＵＭ=0.126000000000000000000000000000D+03
【０１０５】
i＝２としてＳ２０５が実行された後、i＝３としてＳ２０４処理が実行される。まず、積Ａ（３）*Ｂ（３）における誤差を補正するために、Ｓ５０１により、ベクトル成分を以下のように分離する。
Ａ1（３）=0.773694416000000000000000000000D+09
Ａ2（３）=0.700000000000000000000000000000D+01
Ｂ1（３）=0.211729392000000000000000000000D+10
Ｂ2（３）=0.250000000000000000000000000000D+02
【０１０６】
Ｓ５０１が実行された後、Ｓ５０２により、変数Ｓ１、Ｓ２、Ｓ３、Ｓ４は以下のようになる。
Ｓ１=0.474779682161446560000000000000D+17
Ｓ２=0.112614454000000000000000000000D+09
Ｓ３=0.421597464000000000000000000000D+09
Ｓ４=0.100000000000000000000000000000D+01
【０１０７】
Ｓ５０２が実行された後、Ｓ５０３により、変数Ｔ１、Ｔ２は以下のようになる。
Ｔ１=0.474779683287591120000000000000D+17
Ｔ２=-0.200000000000000000000000000000D+01
【０１０８】
Ｓ５０３が実行された後、Ｓ５０４により、変数Ｔ３、Ｔ４は以下のようになる。
Ｔ３=0.421597465000000000000000000000D+09
Ｔ４=0.000000000000000000000000000000D+00
【０１０９】
Ｓ５０４が実行された後、Ｓ５０５により、変数Ｔ５、Ｔ６は以下のようになる。
Ｔ５=0.474779687503565760000000000000D+17
Ｔ６=-0.100000000000000000000000000000D+01
【０１１０】
Ｓ５０５が実行された後、Ｓ５０６により、変数Ｔ７は以下のようになる。
Ｔ７=0.159000000000000000000000000000D+03
【０１１１】
Ｓ５０６が実行された後、Ｓ５０７により、変数Ｄ、Ｅは以下のようになる。
Ｄ=0.474779687503565760000000000000D+17
Ｅ=-0.100000000000000000000000000000D+01
【０１１２】
i＝３としてＳ２０４が実行された後、次にi＝３としてＳ２０５が実行される。まず、Ｓ６０１により、変数Ｓ１１、Ｓ１２は以下のようになる。
Ｓ１１=0.430406079050710732800000000000D+19
Ｓ１２=0.960000000000000000000000000000D+02
【０１１３】
Ｓ６０１が実行された後、Ｓ６０２により、変数Ｓ１３、Ｓ１４は以下のようになる。
Ｓ１３=0.125000000000000000000000000000D+03
Ｓ１４=0.000000000000000000000000000000D+00
【０１１４】
Ｓ６０２が実行された後、Ｓ６０３により、変数Ｓ１５、Ｓ１６は以下のようになる。
Ｓ１５=0.430406079050710732800000000000D+19
Ｓ１６=0.125000000000000000000000000000D+03
【０１１５】
Ｓ６０３が実行された後、Ｓ６０４により、変数Ｓ１７は以下のようになる。
Ｓ１７=0.221000000000000000000000000000D+03
【０１１６】
Ｓ６０４が実行された後、Ｓ６０５により、変数ＳＵＭ、ＤＳＵＭは以下のようになる。
ＳＵＭ= 0.430406079050710732800000000000D+19
ＤＳＵＭ=0.221000000000000000000000000000D+03
【０１１７】
最後にＳ２０６において、変数ＳＵＭとＤＳＵＭの和をＳＵＭに代入することにより、変数ＳＵＭは以下のようになる。
ＳＵＭ=0.430406079050710754900000000000D+19
【０１１８】
以上より、本発明を用いた場合、内積演算Ａ・Ｂ（本願）は以下に示すような結果となる。
Ａ・Ｂ（本願）=0.4304060790507107549*1019
【０１１９】
つまり、Ａ・Ｂ（正解）、Ａ・Ｂ（従来）およびＡ・Ｂ（本願）の演算結果を並べて記載すると、次のようになり、Ａ・Ｂ（本願）の精度が極めて高いことがわかる。
Ａ・Ｂ（正解）=  4304060790507107549
Ａ・Ｂ（従来）=0.43040607905071073*1019  （誤差0.249*103）
Ａ・Ｂ（本願）=0.4304060790507107549*1019（誤差０）
【０１２０】
以上で実施形態の説明を終えるが、本発明の態様はこれらに限定されるものではない。
たとえば、ＩＥＥＥ７５４で規定された単精度形式などを用いて演算を行ってもよい。
また、内積演算について説明したが、加算や乗算などの演算のみに適用してもよい。
さらに、ベクトルの次元数は、３次元以上であってもよい。
【０１２１】
また、数値を所定の桁数以内にする場合は、切り捨てによるものでなくても、切り上げなどによるものであってもよい。
さらに、数値を所定の桁数以内にする場合は、十進数に変換したときに四捨五入する、などの別の方法を用いたものであってもよい。
【０１２２】
また、減算の演算を行う場合も、加算の場合と同様の演算を行うことで、より正確な演算結果を得ることができる。
その他、ハードウェア構成や処理手順などの具体的な構成について、本発明の趣旨を逸脱しない範囲で適宜変更が可能である。たとえば、２台以上の演算装置を組み合わせて使う場合に適用してもよい。
【図面の簡単な説明】
【０１２３】
【図１】データ処理装置の構成図である。
【図２】データ処理装置の処理を示したフローチャートである。
【図３】入力処理Ｓ２０１の詳細図である。
【図４】初期化処理Ｓ２０２の詳細図である。
【図５】処理Ｓ２０４の詳細図である。
【図６】処理Ｓ２０５の詳細図である。
【符号の説明】
【０１２４】
１０１  補助記憶部
１０２  メモリ
１０３  ＣＰＵ
１０４  入力部
１０５  出力部
【図１】
2006302180.tif 000003
【図２】
2006302180.tif 000004
【図３】
2006302180.tif 000005
【図４】
2006302180.tif 000006
【図５】
2006302180.tif 000007
【図６】
2006302180.tif 000008