図面 (/)

技術 演算装置および演算方法

出願人 株式会社日立製作所
発明者 森田秀和浜口信行都倉朗
出願日 2005年4月25日 (15年7ヶ月経過) 出願番号 2005-126326
公開日 2006年11月2日 (14年1ヶ月経過) 公開番号 2006-302180
状態 特許登録済
技術分野 位取り記数法を用いた四則演算 複合演算
主要キーワード 情報落ち 度改善処理 数値配列 補正部分 拡張形式 桁落ち 繰返し処理 内積計算
関連する未来課題
重要な関連分野

この項目の情報は公開日時点(2006年11月2日)のものです。
また、この項目は機械的に抽出しているため、正しく解析できていない場合があります

図面 (7)

課題

より正確な浮動小数点を用いた演算を行うこと。

解決手段

乗算対象である第1の数と第2の数との積の演算を、二進浮動小数点を用いて行う演算装置であって、前記第1の数、前記第2の数、および、演算によって発生した数を、所定の桁数より下位の桁のビット切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、前記記憶部に記憶された前記第1の数を1のビットの最上位桁最下位桁が分かれるように2つ以上の数に分離し、前記分離したそれぞれの数と前記第2の数の積の演算を行い、それぞれの当該演算結果を別々に前記記憶部に記憶させる処理部と、を有することを特徴とする。

概要

背景

一般に、コンピュータなどの演算装置において、乗算加算などの演算を行う場合、二進数表現された数値について、所定の桁の切り捨てあるいは切り上げを行いながら、演算を実行することになる。

たとえば、IEEE(Institute of Electrical and Electronic Engineers)754では、単精度倍精度という二進浮動小数点形式を規定している。単精度とは、1つの数値を32ビット符号部1ビット・指数部8ビット・仮数部23ビット)で表現するものであり、倍精度とは、1つの数値を64ビット(符号部1ビット・指数部11ビット・仮数部52ビット)で表現するものである。
そして、これら単精度および倍精度の拡張形式が演算に用いられる場合もある。

このように、IEEE754では浮動小数点形式が規定されているが、これらの浮動小数点数を用いたコンピュータにおける内積演算では、丸め、情報落ち及び桁落ち誤差が生じるため、正確な内積演算結果が得られない、という問題がある。
そこで、内積演算の精度を改善するものとして、いくつかの装置が提案されている。

たとえば、特許文献1では、入力ベクトルxに対し、全てのベクトル成分からスカラー数βを減じた後、スカラー数α倍したα(x-βI)なる変換を施してから内積演算を行う装置が開示されている。

また、特許文献2では、複数の入力データに対応するビットスライスに基づいて、ルックアップテーブルから該ビットスライスの数値配列に対応する部分内積を検出して出力し、該部分内積を初期値あるいは中間累積値に対して加算して加算出力値を出力し、該加算出力値の下位側切捨てビットの数値を保持し、上記加算処理を入力データの桁数分に対応するサイクルを繰り返して得られる最終累算結果の値に最終加算サイクルから所定サイクル前までの上記切捨てビットの数値を付加することにより、演算精度劣化を改善する演算装置が開示されている。
特開平11−96140号公報(段落0014〜段落0031、図3)
特開2000−132539号公報(段落0066〜段落0073、図1)

概要

より正確な浮動小数点を用いた演算を行うこと。乗算対象である第1の数と第2の数との積の演算を、二進浮動小数点を用いて行う演算装置であって、前記第1の数、前記第2の数、および、演算によって発生した数を、所定の桁数より下位の桁のビットを切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、前記記憶部に記憶された前記第1の数を1のビットの最上位桁最下位桁が分かれるように2つ以上の数に分離し、前記分離したそれぞれの数と前記第2の数の積の演算を行い、それぞれの当該演算結果を別々に前記記憶部に記憶させる処理部と、を有することを特徴とする。

目的

しかしながら、特許文献1、特許文献2ではいずれも、ハードウェアによる内積演算の精度改善方式が採用されていて、ハードウェアの設計段階で桁数に制限が設けられるため、IEEE754に準拠している任意の浮動小数点を用いた内積演算において、丸め、情報落ち及び桁落ちの誤差が少なからず生じることがあり、正確な演算結果が得られないという問題点があった。
そこで、本発明は、前記問題点に鑑みてなされたものであり、より正確な浮動小数点を用いた演算を行うことを目的とする。

効果

実績

技術文献被引用数
0件
牽制数
0件

この技術が所属する分野

ライセンス契約や譲渡などの可能性がある特許掲載中! 開放特許随時追加・更新中 詳しくはこちら

請求項1

乗算対象である第1の数と第2の数との積の演算を、二進浮動小数点を用いて行う演算装置であって、前記第1の数、前記第2の数、および、演算によって発生した数を、所定の桁数より下位の桁のビット切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、前記記憶部に記憶された前記第1の数を1のビットの最上位桁最下位桁が分かれるように2つ以上の数に分離し、前記分離したそれぞれの数と前記第2の数の積の演算を行い、それぞれの当該演算結果を別々に前記記憶部に記憶させる処理部と、を有することを特徴とする演算装置。

請求項2

加算対象である第1の数と第2の数との和の演算を、二進浮動小数点を用いて行う演算装置であって、前記第1の数、前記第2の数、および、演算によって発生した数を、所定の桁数より下位の桁のビットを切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、前記記憶部に記憶された前記第1の数と前記第2の数の和を第3の数とし、前記第3の数と前記第1の数の差を第4の数とし、前記第2の数と前記第4の数の差を第5の数とし、前記第3の数と前記第5の数を前記第1の数と前記第2の数の和として別々に前記記憶部に記憶させる処理部と、を有することを特徴とする演算装置。

請求項3

請求項1に記載の演算装置と請求項2に記載の演算装置とを組み合わせることにより、乗算と加算とからなる内積演算を行うことを特徴とする演算装置。

請求項4

乗算対象である第1の数と第2の数との積の演算を、二進浮動小数点を用いて行う演算装置におけるコンピュータ演算方法であって、前記演算装置は、前記第1の数、前記第2の数、および、演算によって発生した数を、所定の桁数より下位の桁のビットを切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、処理部とを備えるとともに、前記処理部は、前記記憶部に記憶された前記第1の数を1のビットの最上位桁と最下位桁が分かれるように2つ以上の数に分離し、前記分離したそれぞれの数と前記第2の数の積の演算を行い、それぞれの当該演算結果を別々に前記記憶部に記憶させることを特徴とする演算方法。

請求項5

加算対象である第1の数と第2の数との和の演算を、二進浮動小数点を用いて行う演算装置におけるコンピュータの演算方法であって、前記演算装置は、前記第1の数、前記第2の数、および、演算によって発生した数を、所定の桁数より下位の桁のビットを切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、処理部を備えるとともに、前記処理部は、前記記憶部に記憶された前記第1の数と前記第2の数の和を第3の数とし、前記第3の数と前記第1の数の差を第4の数とし、前記第2の数と前記第4の数の差を第5の数とし、前記第3の数と前記第5の数を前記第1の数と前記第2の数の和として別々に前記記憶部に記憶させることを特徴とする演算方法。

技術分野

0001

本発明は、浮動小数点を用いた演算を行う演算装置および演算方法に関する。

背景技術

0002

一般に、コンピュータなどの演算装置において、乗算加算などの演算を行う場合、二進数表現された数値について、所定の桁の切り捨てあるいは切り上げを行いながら、演算を実行することになる。

0003

たとえば、IEEE(Institute of Electrical and Electronic Engineers)754では、単精度倍精度という二進浮動小数点形式を規定している。単精度とは、1つの数値を32ビット符号部1ビット・指数部8ビット・仮数部23ビット)で表現するものであり、倍精度とは、1つの数値を64ビット(符号部1ビット・指数部11ビット・仮数部52ビット)で表現するものである。
そして、これら単精度および倍精度の拡張形式が演算に用いられる場合もある。

0004

このように、IEEE754では浮動小数点形式が規定されているが、これらの浮動小数点数を用いたコンピュータにおける内積演算では、丸め、情報落ち及び桁落ち誤差が生じるため、正確な内積演算結果が得られない、という問題がある。
そこで、内積演算の精度を改善するものとして、いくつかの装置が提案されている。

0005

たとえば、特許文献1では、入力ベクトルxに対し、全てのベクトル成分からスカラー数βを減じた後、スカラー数α倍したα(x-βI)なる変換を施してから内積演算を行う装置が開示されている。

0006

また、特許文献2では、複数の入力データに対応するビットスライスに基づいて、ルックアップテーブルから該ビットスライスの数値配列に対応する部分内積を検出して出力し、該部分内積を初期値あるいは中間累積値に対して加算して加算出力値を出力し、該加算出力値の下位側切捨てビットの数値を保持し、上記加算処理を入力データの桁数分に対応するサイクルを繰り返して得られる最終累算結果の値に最終加算サイクルから所定サイクル前までの上記切捨てビットの数値を付加することにより、演算精度劣化を改善する演算装置が開示されている。
特開平11−96140号公報(段落0014〜段落0031、図3
特開2000−132539号公報(段落0066〜段落0073、図1

発明が解決しようとする課題

0007

しかしながら、特許文献1、特許文献2ではいずれも、ハードウェアによる内積演算の精度改善方式が採用されていて、ハードウェアの設計段階で桁数に制限が設けられるため、IEEE754に準拠している任意の浮動小数点を用いた内積演算において、丸め、情報落ち及び桁落ちの誤差が少なからず生じることがあり、正確な演算結果が得られないという問題点があった。
そこで、本発明は、前記問題点に鑑みてなされたものであり、より正確な浮動小数点を用いた演算を行うことを目的とする。

課題を解決するための手段

0008

前記課題を解決するために、本発明に係る演算装置は、乗算対象である第1の数と第2の数との積の演算を、二進浮動小数点を用いて行う演算装置であって、前記第1の数、前記第2の数、および、演算によって発生した数を、所定の桁数より下位の桁のビットを切り捨てるかあるいは切り上げることによって所定の桁数内の数として記憶する記憶部と、前記記憶部に記憶された前記第1の数を1のビットの最上位桁最下位桁が分かれるように2つ以上の数に分離し、前記分離したそれぞれの数と前記第2の数の積の演算を行い、それぞれの当該演算結果を別々に前記記憶部に記憶させる処理部と、を有することを特徴とする。その他の手段については、後記する。

発明の効果

0009

本発明によれば、より正確な浮動小数点を用いた演算を行うことができる。

発明を実施するための最良の形態

0010

以下、本発明に係るデータ処理装置(演算装置)について、適宜図面を参照しながら説明する。

0011

まず、図1を参照しながら、データ処理装置の構成について説明する。図1は、データ処理装置の構成図である。
データ処理装置1は、補助記憶部101、メモリ(記憶部)102、処理部としてのCPU(Central Processing Unit)103、入力部104、出力部105および入出力インタフェース106を備えて構成される。

0012

補助記憶部101は、各種情報を記憶するものであり、たとえば、ハードディスク、ROM(Read Only Memory)などにより実現される。補助記憶部101は、ここでは、プログラム111、コンパイラ112および実行モジュール113を記憶している。

0013

プログラム111は、図2で示すフローチャート上の処理が記述されているプログラム(以下、ソースプログラムという)である。
コンパイラ112は、プログラム111をコンパイルリンクするものである。
実行モジュール113は、コンパイラ112によってコンパイル・リンクされたモジュールである。

0014

メモリ102は、各種情報を記憶する一時記憶手段であり、たとえば、RAM(Random Access Memory)により実現される。
CPU103は、各種演算処理を行うものであり、メモリ102、入出力インタフェース106を介して実行モジュール113を実行する役割を果たす。
入力部104は、各種実コマンドなどを入力する入力装置である。
出力部105は、各種実行結果などを出力する出力装置である。
入出力インタフェース106は、図1に示すように、各構成間の入出力インタフェースの役割を果たすものである。

0015

そして、前記のように構成されるデータ処理装置1は、次のように動作する。
まず、操作者により入力部104から入力されたコンパイルコマンドは、入出力インタフェース106を介して、メモリ102にストアされる。メモリ102では、補助記憶部101のプログラム111が、コンパイラ112によってコンパイル・リンクされ、機械語コードである実行モジュール113が生成される。

0016

次に、操作者により入力部104から実行コマンドが入力されると、CPU103がメモリ102に実行モジュール113をロードする。実行モジュール113がメモリ102にロードされると、CPU103によって、図2に示すフローチャート上の各処理S201〜S208がメモリ102からCPU103に逐次呼び出され、各処理が実行された後、その実行結果がメモリ102にストアされる。
メモリ102にストアされた実行結果は、CPU103によって、入出力インターフェイス106を介して、出力部105に出力される。

0017

続いて、図2を参照しながら、データ処理装置の処理について説明する(適宜図1参照)。図2は、データ処理装置の全体的な処理を示したフローチャートである。ここでは、i=N次元での内積演算のベクトルA(i)、B(i)の精度改善を行う場合を例にして説明する。

0018

まず、入力処理S201が、メモリ102からCPU103に呼び出される。この入力処理S201では、図3に示すように、CPU103が、S301からS303までの処理を繰り返し、操作者により入力部104から入力されたi=N次元のデータ、すなわち、A(i)、B(i)を、メモリ102にロードさせる。

0019

図2に戻って、次に、初期化処理S202がメモリ102からCPU103に呼び出される。この初期化処理S202では、図4に示すように、S401において、CPU103が、変数であるSUMおよびDSUMの領域をメモリ102上に確保し、SUMおよびDSUMの値をそれぞれ0に初期化する。

0020

SUMは、最終的な誤差の補正がされていない和を代入する変数であり、DSUMは、誤差の補正部分を代入する変数である。
このようなSUM、DSUMを用いることにより、データ処理装置1において数値の乗算や加算などの演算を行う場合、次のような効果がある。すなわち、メモリ102やCPU103が記憶(保持)できる桁数が決まっているので、それによる数値のずれを誤差として記憶し、その後の演算においてもその誤差を使用することで、演算全体の誤差を減らしたり、なくしたりすることが可能となる。

0021

次に、図2の処理S203〜S206において、ベクトルのN次元数分の繰返し処理、すなわち、内積の演算処理を行う。たとえば、2次元の場合はN=2とし、その場合、A(i)、B(i)は、それぞれA(A(1),A(2))、B(B(1),B(2))と表現することとする。

0022

具体的には、まず、CPU103は、i=NのときのA(i)*B(i)における誤差を補正する(S204)。次に、CPU103は、i=NのときのΣA(i)*B(i)における誤差を補正する(S205)。

0023

図5は、図2に示したS204の詳細図である。まず、S501において、CPU103は、変数A(i)、A1(i)、A2(i)、B(i)、B1(i)およびB2(i)の領域を、メモリ102上に確保する。
そして、CPU103は、A(i)を、1のビットの最上位桁と最下位桁が分かれるようにA1(i)とA2(i)に分離する。

0024

また、CPU103は、B(i)についても同様に、1のビットの最上位桁と最下位桁が分かれるようにB(i)とB2(i)に分離する。
なお、この分離は、A(i),B(i)のいずれかのみに行うようにしてもよい。

0025

S502において、CPU103は、変数S1、S2、S3およびS4の領域を、メモリ102上に確保し、A1(i)*B1(i)をS1、A1(i)*B2(i)をS2、A2(i)*B1(i)をS3、A2(i)*B2(i)をS4にそれぞれ代入する。
これにより、A(i)*B(i)は、S1+S2+S3+S4で表現されることとなる。

0026

S503において、CPU103は、変数T1、T2の領域をメモリ102上に確保し、前記したS1とS2の和をT1に代入する。また、S1とS2の和の誤差をS2-(T1-S1)から計算し、T2に代入する。
これにより、和S1+S2で生じた丸めや情報落ちによる誤差をフォローすることができる。

0027

S504において、CPU103は、変数T3、T4の領域をメモリ102上に確保し、前記したS3とS4の和をT3に代入する。また、S3とS4の和の誤差をS4-(T3-S3)から計算し、T4に代入する。
これにより、和S3+S4で生じた丸めや情報落ちによる誤差をフォローすることができる。

0028

S505において、CPU103は、変数T5、T6の領域をメモリ102上に確保し、前記したT1とT3の和をT5に代入する。また、T1とT3の和の誤差をT3-(T5-T1)から計算し、T6に代入する。
これにより、和T1+T3で生じた丸めや情報落ちによる誤差をフォローすることができる。

0029

S506において、CPU103は、変数T7の領域をメモリ102上に確保し、前記したT2とT4とT6の和をT7に代入する。
なお、このT7は、大きな誤差を生じる可能性が少ないので、その誤差についてフォローしなくても問題はない。

0030

S507において、CPU103は、変数D、Eの領域をメモリ102上に確保し、前記したT5とT7の和をDに代入する。また、T5とT7の和の誤差をT7-(D-T5)から計算し、Eに代入する。
このように、CPU103は、与えられたすべてのiについて、S501〜S507の処理を行う。

0031

図6は、図2に示したS205の詳細図である。なお、図6のS601〜S605は、図5のS503〜S507と同様の処理である。

0032

S601において、CPU103は、変数S11、S12の領域をメモリ102上に確保し、前記したSUMとDの和をS11に代入する。また、SUMとDの和の誤差をS12に代入する。

0033

S602において、CPU103は、変数S13、S14の領域をメモリ102上に確保し、前記したDSUMとEの和をS13に代入する。また、DSUMとEの和の誤差をS14に代入する。

0034

S603において、CPU103は、変数S15、S16の領域をメモリ102上に確保し、前記したS11とS13の和をS15に代入する。また、S11とS13の和の誤差をS16に代入する。

0035

S604において、CPU103は、変数S17の領域をメモリ102上に確保し、前記したS12とS14とS16の和をS17に代入する。

0036

S605において、CPU103は、前記したS15とS17の和をSUMに代入し、S15とS17の和の誤差をDSUMに代入する。
このように、CPU103は、与えられたすべてのiについて、S601〜S605の処理を行う。

0037

図2戻り、S207において、CPU103は、SUMと補正項DSUMの和を演算し、SUMに代入する。
S208において、CPU103は、出力処理として、S207で代入したSUMの値を演算結果として出力部105に出力する。

0038

このように、S201〜S208の各処理を行うことで、内積演算A・Bについての正確な演算結果を得ることができる。
また、このように正確な演算結果を得ることにより、高精度の内積計算を必要とする産業(例えば、ニューラルネットワークベクトル量子化、敏感な数値シミュレーションを必要とする物理学分野)に本発明を応用することができる。

0039

続いて、前記した内積演算の具体例について説明する(適宜各図参照)。なお、ここでは、理解を容易にするため、2次元ベクトルに関する内積演算の場合を例にとり説明する。また、データ処理装置1(図1参照)が各演算で使用する数値について、仮数部として保持できる桁数を8ビットとする(指数部を除く)。そして、演算結果の数値が8ビットを超えた場合、上位8ビットのみを保持し、残りのビットは切り捨てるものとする。

0040

前記条件のもとで、2次元ベクトルA及びBを次のように設定する。
A=(A(1),A(2))、B=(B(1),B(2))
A(1)、A(2)、B(1)、B(2)は、二進数であり、それぞれの値は、次の通りである。
A(1)=10110111(十進数表記で「183」:以下同様に、かっこ内は十進数表記)
A(2)=10010101(149)
B(1)=11011010(218)
B(2)=11100011(227)

0041

前記条件のとき、内積演算A・Bの正確な答えであるA・B(正解)は、次のようになる。
A・B(正解)=1001101111010110(39894)+
1000010000011111(33823)
=10001111111110101(73717)

0042

そして、本実施形態のデータ処理装置1(図1参照)を用いない場合、すなわち、従来のように切り捨てによって生じた誤差を補正しない場合、内積演算A・Bの結果であるA・B(従来)は、次のようになる。
A・B(従来)=10011011*28(39680)+
10000100*28(33792)
=10001111*29(73216)

0043

つまり、従来の演算方式では、73717−73216=501の誤差が生じてしまう。

0044

次に、前記条件のときに、本実施形態のデータ処理装置1(図1参照)を用いて、内積演算A・Bの結果であるA・B(本願)を算出する演算について説明する(適宜各図参照)。

0045

まず、S201において、S301に示すように、入力部104からデータを入力する。その結果、以下のように配列が初期化される。
A(1)=10110111(183)
A(2)=10010101(149)
B(1)=11011010(218)
B(2)=11100011(227)

0046

次に、S202において、CPU103は、変数SUM、DSUMのS401に示すように、変数SUM及びDSUMの値を0に初期化する。
また、この例では2次元での内積演算を実施するため、S203における変数Nを2に初期化する。

0047

そして、S202が実行された後、i=1としてS204が実行される。次に、積A(1)*B(1)における誤差を補正するために、S501において、CPU103は、ベクトル成分を以下のように分離する。
A(1)=A1(1)+A2(1)
B(1)=B1(1)+B2(1)
A1(1)=10110000(176)
A2(1)=00000111(7)
B1(1)=11010000(208)
B2(1)=00001010(10)

0048

なお、ここでは、A(1)およびB(1)の各々について、A1(1)およびB1(1)のそれぞれ下4桁が0になるように分離したが、下3桁や下2桁などが0になるように分離してもよい。また、A(1)およびB(1)のいずれかだけを分離するようにしてもよい。
いずれにしても、このように、A(1)およびB(1)を、1のビットの最上位桁と最下位桁が分かれるように2つ以上の数に分離することで、以下の演算における誤差を少なくすることができるのである。

0049

そして、S501が実行された後、S502において、変数S1、S2、S3、S4は以下のようになる。
S1=10001111*28(36608)
S2=11011100*23(1760)
S3=10110110*23(1456)
S4=01000110(70)

0050

S502が実行された後、S503において、変数T1、T2は以下のようになる。
T1=10010101*28(38144)
T2=11100000(224)

0051

また、S504において、変数T3、T4は以下のようになる。
T3=10111110*23(1520)
T4=00000110(6)

0052

さらに、S505において、変数T5、T6は以下のようになる。
T5=10011010*28(39424)
T6=11110000(240)

0053

また、S506において、変数T7は以下のようになる。
T7=11101011*21(470)

0054

さらに、S507において、変数D、Eは以下のようになる。
D=10011011*28(39680)
E=11010110(214)

0055

続いて、i=1としてS205が実行される。なお、ここでは、SUMとDSUMは初期値のままであるので、ともに0である。

0056

まず、S601において、変数S11、S12は以下のようになる。
S11=10011011*28(39680)
S12=000000000(0)

0057

また、S602において、変数S13、S14は以下のようになる。
S13=11010110(214)
S14=00000000(0)

0058

さらに、S603において、変数S15、S16は以下のようになる。
S15=10011011*28(39680)
S16=11010110(214)

0059

また、S604において、変数S17は以下のようになる。
S17=11010110(214)

0060

そして、S605において、変数SUM、DSUMは以下のようになる。
SUM=10011011*28(39680)
DSUM=11010110(214)

0061

次に、i=2としてS204が実行される。まず、積A(2)*B(2)における誤差を補正するために、S501において、ベクトル成分を以下のように分離する。
A(2)=A1(2)+A2(2)
B(2)=B1(2)+B2(2)
A1(2)=10010000(144)
A2(2)=00000101(5)
B1(2)=11100000(225)
B2(2)=00000011(3)

0062

そして、S501が実行された後、S502において、変数S1、S2、S3、S4は以下のようになる。
S1=11111100*27(32256)
S2=11011000*21(432)
S3=10001100*23(1120)
S4=00001111(15)

0063

S502が実行された後、S503において、変数T1、T2は以下のようになる。
T1=11111111*27(32640)
T2=00110000(48)

0064

また、S504において、変数T3、T4は以下のようになる。
T3=10001101*23(1128)
T4=00000110(7)

0065

さらに、S505において、変数T5、T6は以下のようになる。
T5=10000011*28(33536)
T6=11101000(232)

0066

また、S506において、変数T7は以下のようになる。
T7=10001111*21(286)

0067

さらに、S507において、変数D、Eは以下のようになる。
D=10000100*28(33792)
E=00011110(30)

0068

続いて、i=2としてS205が実行される。なお、ここでは、SUMとDSUMの値は、次のようになっている。
SUM=10011011*28(39680)
DSUM=11010110(214)

0069

まず、S601において、変数S11、S12は以下のようになる。
S11=10001111*29(73216)
S12=10000000*21(256)

0070

また、S602において、変数S13、S14は以下のようになる。
S13=11110100(244)
S14=00000000(0)

0071

さらに、S603において、変数S15、S16は以下のようになる。
S15=10001111*29(73216)
S16=11110100(244)

0072

また、S604において、変数S17は以下のようになる。
S17=11111010*21(500)

0073

そして、S605において、変数SUM、DSUMは以下のようになる。
SUM=10001111*29(73216)
DSUM=11111010*21(500)

0074

最後に、S207において、CPU103は、SUM+DSUMをSUMに代入し、SUM=73716を得る。
なお、S207においては、実際には、SUMの値とDSUMの値を別々にメモリ102に記憶するので、丸め誤差などが生じることはない。

0075

そして、出力処理S208において、CPU103は、演算結果、すなわち、A・B(本願)=10001111111110100(73716)を出力する。

0076

つまり、A・B(正解)、A・B(従来)およびA・B(本願)の演算結果の十進数表記を並べて記載すると、次のようになり、A・B(本願)の誤差がA・B(従来)の誤差に比べて、極めて小さくなることがわかる。
A・B(正解)=73717
A・B(従来)=73216(誤差501)
A・B(本願)=73716(誤差1)

0077

具体的な別の例として、IEEE754で規定された倍精度形式を用いた3次元での内積演算A・Bにおける精度改善処理を以下に示す。なお、以下の例では、数値は十進数表記とする。
3次元ベクトルA及びBを以下のように設定するとき、内積演算A・B(正解)は以下のようになる。
A=(a00,a01,a02)、B=(b00,b10,b20)
a00=1738663799
a01=773694423
a02=112614455
b00=1506009561
b10=2117293945
b20=421597465
A・B(正解)=a00*b00+a01*b10+a02*b20=4304060790507107549

0078

まず、上記の条件で本発明を用いない場合、すなわち、丸め、情報落ち及び桁落ちで生じた誤差を補正しない場合、内積演算A・B(従来)は以下に示すような結果となる。
A・B(従来)=0.43040607905071073*1019

0079

一方、上記の条件で、本発明を用いた場合、以下に示すような結果となる。まず、入力処理S201により、S301のように、入力装置104からデータを入力する。その結果、以下のように配列が初期化される。
A(1)=1738663799
A(2)=773694423
A(3)=112614455
B(1)=1506009561
B(2)=2117293945
B(3)=421597465

0080

次に、初期化処理S202により、変数SUM、S401のように、変数SUM及びDSUMを0に初期化する。また、今回の例では3次元での内積演算を実施するため、S203における変数Nを3に初期化する。

0081

初期化処理が実行された後、i=1としてS204処理が実行される。まず、積A(1)*B(1)における誤差を補正するために、S501により、ベクトル成分を以下のように分離する。なお、ここで、Dは十進数であることを示し、変数Dとは無関係である。また、右辺末尾の2桁の数は、10を底とする指数の指数部を示す。
A1(1)=0.173866377600000000000000000000D+10
A2(1)=0.230000000000000000000000000000D+02
B1(1)=0.150600953600000000000000000000D+10
B2(1)=0.250000000000000000000000000000D+02

0082

S501が実行された後、S502により、変数S1、S2、S3、S4は以下のようになる。
S1=0.261844422655376793600000000000D+19
S2=0.434665944000000000000000000000D+11
S3=0.346382193280000000000000000000D+11
S4=0.575000000000000000000000000000D+03

0083

S502が実行された後、S503により、変数T1、T2は以下のようになる。
T1=0.261844427002036224000000000000D+19
T2=0.960000000000000000000000000000D+02

0084

S503が実行された後、S504により、変数T3、T4は以下のようになる。
T3=0.346382199030000000000000000000D+11
T4=0.000000000000000000000000000000D+00

0085

S504が実行された後、S505により、変数T5、T6は以下のようになる。
T5=0.261844430465858201600000000000D+19
T6=0.127000000000000000000000000000D+03

0086

S505が実行された後、S506により、変数T7は以下のようになる。
T7=0.223000000000000000000000000000D+03

0087

S506が実行された後、S507により、変数D、Eは以下のようになる。
D=0.261844430465858201600000000000D+19
E=0.223000000000000000000000000000D+03

0088

i=1としてS204が実行された後、次にi=1としてS205が実行される。
まず、S601により、変数S11、S12は以下のようになる。
S11=0.261844430465858201600000000000D+19
S12=0.000000000000000000000000000000D+00

0089

S601が実行された後、S602により、変数S13、S14は以下のようになる。
S13=0.223000000000000000000000000000D+03
S14=0.000000000000000000000000000000D+00

0090

S602が実行された後、S603により、変数S15、S16は以下のようになる。
S15=0.261844430465858201600000000000D+19
S16=0.223000000000000000000000000000D+03

0091

S603が実行された後、S604により、変数S17は以下のようになる。
S17=0.223000000000000000000000000000D+03

0092

S604が実行された後、S605により、変数SUM、DSUMは以下のようになる。
SUM= 0.261844430465858201600000000000D+19
DSUM=0.223000000000000000000000000000D+03

0093

i=1としてS205が実行された後、i=2としてS204処理が実行される。まず、積A(2)*B(2)における誤差を補正するために、S501により、ベクトル成分を以下のように分離する。
A1(2)=0.773694416000000000000000000000D+09
A2(2)=0.700000000000000000000000000000D+01
B1(2)=0.211729392000000000000000000000D+10
B2(2)=0.250000000000000000000000000000D+02

0094

S501が実行された後、S502により、変数S1、S2、S3、S4は以下のようになる。
S1=0.163813848293475072000000000000D+19
S2=0.193423604000000000000000000000D+11
S3=0.148210574400000000000000000000D+11
S4=0.175000000000000000000000000000D+03

0095

S502が実行された後、S503により、変数T1、T2は以下のようになる。
T1=0.163813850227711104000000000000D+19
T2=0.800000000000000000000000000000D+02

0096

S503が実行された後、S504により、変数T3、T4は以下のようになる。
T3=0.346382199030000000000000000000D+11
T4=0.000000000000000000000000000000D+00

0097

S504が実行された後、S505により、変数T5、T6は以下のようになる。
T5=0.163813851709816857600000000000D+19
T6=0.790000000000000000000000000000D+02

0098

S505が実行された後、S506により、変数T7は以下のようになる。
T7=0.159000000000000000000000000000D+03

0099

S506が実行された後、S507により、変数D、Eは以下のようになる。
D=0.163813851709816883200000000000D+19
E=-0.970000000000000000000000000000D+02

0100

i=2としてS204が実行された後、次にi=2としてS205が実行される。まず、S601により、変数S11、S12は以下のようになる。
S11=0.425658282175675084800000000000D+19
S12=0.000000000000000000000000000000D+00

0101

S601が実行された後、S602により、変数S13、S14は以下のようになる。
S13=0.126000000000000000000000000000D+03
S14=0.000000000000000000000000000000D+00

0102

S602が実行された後、S603により、変数S15、S16は以下のようになる。
S15=0.425658282175675084800000000000D+19
S16=0.126000000000000000000000000000D+03

0103

S603が実行された後、S604により、変数S17は以下のようになる。
S17=0.126000000000000000000000000000D+03

0104

S604が実行された後、S605により、変数SUM、DSUMは以下のようになる。
SUM= 0.425658282175675084800000000000D+19
DSUM=0.126000000000000000000000000000D+03

0105

i=2としてS205が実行された後、i=3としてS204処理が実行される。まず、積A(3)*B(3)における誤差を補正するために、S501により、ベクトル成分を以下のように分離する。
A1(3)=0.773694416000000000000000000000D+09
A2(3)=0.700000000000000000000000000000D+01
B1(3)=0.211729392000000000000000000000D+10
B2(3)=0.250000000000000000000000000000D+02

0106

S501が実行された後、S502により、変数S1、S2、S3、S4は以下のようになる。
S1=0.474779682161446560000000000000D+17
S2=0.112614454000000000000000000000D+09
S3=0.421597464000000000000000000000D+09
S4=0.100000000000000000000000000000D+01

0107

S502が実行された後、S503により、変数T1、T2は以下のようになる。
T1=0.474779683287591120000000000000D+17
T2=-0.200000000000000000000000000000D+01

0108

S503が実行された後、S504により、変数T3、T4は以下のようになる。
T3=0.421597465000000000000000000000D+09
T4=0.000000000000000000000000000000D+00

0109

S504が実行された後、S505により、変数T5、T6は以下のようになる。
T5=0.474779687503565760000000000000D+17
T6=-0.100000000000000000000000000000D+01

0110

S505が実行された後、S506により、変数T7は以下のようになる。
T7=0.159000000000000000000000000000D+03

0111

S506が実行された後、S507により、変数D、Eは以下のようになる。
D=0.474779687503565760000000000000D+17
E=-0.100000000000000000000000000000D+01

0112

i=3としてS204が実行された後、次にi=3としてS205が実行される。まず、S601により、変数S11、S12は以下のようになる。
S11=0.430406079050710732800000000000D+19
S12=0.960000000000000000000000000000D+02

0113

S601が実行された後、S602により、変数S13、S14は以下のようになる。
S13=0.125000000000000000000000000000D+03
S14=0.000000000000000000000000000000D+00

0114

S602が実行された後、S603により、変数S15、S16は以下のようになる。
S15=0.430406079050710732800000000000D+19
S16=0.125000000000000000000000000000D+03

0115

S603が実行された後、S604により、変数S17は以下のようになる。
S17=0.221000000000000000000000000000D+03

0116

S604が実行された後、S605により、変数SUM、DSUMは以下のようになる。
SUM= 0.430406079050710732800000000000D+19
DSUM=0.221000000000000000000000000000D+03

0117

最後にS206において、変数SUMとDSUMの和をSUMに代入することにより、変数SUMは以下のようになる。
SUM=0.430406079050710754900000000000D+19

0118

上より、本発明を用いた場合、内積演算A・B(本願)は以下に示すような結果となる。
A・B(本願)=0.4304060790507107549*1019

0119

つまり、A・B(正解)、A・B(従来)およびA・B(本願)の演算結果を並べて記載すると、次のようになり、A・B(本願)の精度が極めて高いことがわかる。
A・B(正解)= 4304060790507107549
A・B(従来)=0.43040607905071073*1019 (誤差0.249*103)
A・B(本願)=0.4304060790507107549*1019(誤差0)

0120

以上で実施形態の説明を終えるが、本発明の態様はこれらに限定されるものではない。
たとえば、IEEE754で規定された単精度形式などを用いて演算を行ってもよい。
また、内積演算について説明したが、加算や乗算などの演算のみに適用してもよい。
さらに、ベクトルの次元数は、3次元以上であってもよい。

0121

また、数値を所定の桁数以内にする場合は、切り捨てによるものでなくても、切り上げなどによるものであってもよい。
さらに、数値を所定の桁数以内にする場合は、十進数に変換したときに四捨五入する、などの別の方法を用いたものであってもよい。

0122

また、減算の演算を行う場合も、加算の場合と同様の演算を行うことで、より正確な演算結果を得ることができる。
その他、ハードウェア構成処理手順などの具体的な構成について、本発明の趣旨を逸脱しない範囲で適宜変更が可能である。たとえば、2台以上の演算装置を組み合わせて使う場合に適用してもよい。

図面の簡単な説明

0123

データ処理装置の構成図である。
データ処理装置の処理を示したフローチャートである。
入力処理S201の詳細図である。
初期化処理S202の詳細図である。
処理S204の詳細図である。
処理S205の詳細図である。

符号の説明

0124

101補助記憶部
102メモリ
103 CPU
104 入力部
105 出力部

ページトップへ

この技術を出願した法人

この技術を発明した人物

ページトップへ

関連する挑戦したい社会課題

関連する公募課題

ページトップへ

おススメ サービス

おススメ astavisionコンテンツ

新着 最近 公開された関連が強い技術

この 技術と関連性が強い技術

関連性が強い 技術一覧

この 技術と関連性が強い人物

関連性が強い人物一覧

この 技術と関連する社会課題

関連する挑戦したい社会課題一覧

この 技術と関連する公募課題

関連する公募課題一覧

astavision 新着記事

サイト情報について

本サービスは、国が公開している情報(公開特許公報、特許整理標準化データ等)を元に構成されています。出典元のデータには一部間違いやノイズがあり、情報の正確さについては保証致しかねます。また一時的に、各データの収録範囲や更新周期によって、一部の情報が正しく表示されないことがございます。当サイトの情報を元にした諸問題、不利益等について当方は何ら責任を負いかねることを予めご承知おきのほど宜しくお願い申し上げます。

主たる情報の出典

特許情報…特許整理標準化データ(XML編)、公開特許公報、特許公報、審決公報、Patent Map Guidance System データ