(57)【要約】【課題】デジタル演算装置は高い精度の演算を容易に実現できるが、演算に使用される値に含まれる誤差には配慮されておらず、演算結果がどの程度の有効桁を有するか不明という問題があった。【解決手段】数値文字列を入力する際、文字として記述された最下位桁の重みを誤差の標準偏差とみなすこと、演算に際しては値自体と誤差分散を対として扱い各々に対して演算を施すこと、演算結果の表示に際しては値と対として得られた演算結果の誤差分散を利用して、値の有効桁のみを文字列に変換することで、この問題を解決する。【選択図】図１
2015082152.tif 000002
【特許請求の範囲】
【請求項１】
誤差を含む数値情報に演算・格納などの処理を施すに際して、その値自体とこれに含まれる誤差の大きさ表す統計的指標（誤差指標と記す）の値とを対として一連の演算を遂行することを特徴とする数値演算方法もしくはこのための装置。ここで、誤差指標とは誤差分散、誤差の標準偏差、誤差の標準偏差の数値の絶対値に対する比率などの統計的指標を意味し、特に誤差分散を用いることが好ましい。
【請求項２】
請求項1記載の方法もしくは装置であって、文字列を数値に変換し、あるいは数値を文字列に変換する際に、該数値文字列の最小桁の重みを誤差の標準偏差とみなすことを特徴とする数値演算方法もしくはこのための装置。
【請求項３】
請求項1ないし請求項２記載の数値演算方法もしくはこのための装置であって、（１）数式上は同じ結果を与える複数の演算手段と、（２）前記複数の演算手段から得られた結果から誤差指標が最小である演算結果を選択する手段、の双方を含むことを特徴とする数値演算方法もしくはこのための装置。
【請求項４】
請求項1ないし請求項３記載の装置であって、浮動小数点数を格納するレジスタが（１）その値自体を格納する部分と（２）その値の誤差分散を格納する部分、の双方を含むこと、演算装置が（１）浮動小数点の値に対して演算を施す浮動小数点演算装置と（２）その値の誤差分散に対して演算を施す誤差分散演算装置、の双方を含んで構成されることを特徴とする数値演算装置。
【請求項５】
請求項1ないし請求項４記載の数値演算方法もしくはこのための装置であって、浮動小数点数の値を共に整数である仮数部Ｍと指数部ＫによりM C^Kとして扱うこと、誤差分散は同じく整数である仮数部Ｖと前記指数部ＫによりV C^(2 K−B)として扱うことを特徴とする数値演算方法もしくはこのための装置。ここで「^」はべき乗演算記号、Ｃは２もしくはその整数乗である定数、Ｂは０または正の整数である定数とする。
【請求項６】
文字列で表現されたコンピュータプログラムをＣＰＵで実行可能な形式に変換するコンパイラ・ソフトウエアであって、浮動小数点数をその値自体とこれに含まれる誤差分散との対に変換し、浮動小数点演算に対してはその値自体と誤差分散の双方に対する処理コードを生成すること、ソースコード中に記述された浮動小数点定数を、記述された最下位桁の重みを誤差の標準偏差とみなしその自乗を誤差分散として定数値と対とすること、浮動小数点数と文字列との相互変換に際して数値文字列に記述された最小桁の重みと誤差の標準偏差とが同等となるように処理すること、を特徴とするコンパイラ・ソフトウエア。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は数値演算装置に関わり、特に、デジタル演算する際に演算結果に含まれる誤差の大きさを自動的に演算する方法とこれを実現する装置に関わる。
【背景技術】
【０００２】
デジタルコンピュータは、高い精度の演算を容易に実現できることから、今日では幅広い分野で利用されているが、演算に使用される数値に含まれる誤差は処理の対象外であり、演算の結果に含まれる誤差に関する情報は得ていない。
【０００３】
デジタル演算においては、数値を有限のビット幅で表現することから、桁落ちという誤差要因がある。桁落ちに関しては従来から検討課題となっており、たとえば特許文献1および特許文献２では卓上電子計算機における桁落ちを早期発見して演算速度を改善する手法が開示されている。非特許文献1もまた数値演算の精度保証を扱っている。しかしながら、これらはいずれも浮動小数点演算の桁落ちによる誤差を対象としており、入力される数値自体が持つ誤差に起因して演算結果に含まれる誤差を対象とするものではない。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開2006-65789
【特許文献２】特開2000-322238
【非特許文献】
【０００５】
【非特許文献１】大石進一「精度保証つき数値計算（現代非線形科学シリーズ）」コロナ社（2000）
【非特許文献２】矢吹太朗「文法からはじめるプログラミング言語Microsoft Visual C++入門」日経BPソフトプレス（2009）
【発明の概要】
【発明が解決しようとする課題】
【０００６】
科学技術計算に際しては、内部で使用する係数や入力される数値には多くの場合誤差が含まれ、これが演算過程を通して伝播される結果、演算結果にも誤差が含まれる。演算結果に許容される誤差は計算目的に応じて限度があり、演算結果がこれを上回る誤差を含む場合には、この演算結果は使用に耐えない。前記公知文献では浮動小数点処理に伴う桁落ちを問題としているが、デジタルコンピュータで一般的に使用されている倍精度浮動小数点数は十進表現で約１５桁の精度を持ち、通常扱われる数値自体が持つ精度はこれよりはるかに低い。すなわち、技術的工業的な応用分野においては、ほとんどの場合、浮動小数点表現に伴う桁落ちよりも取り扱われる数値に含まれる誤差の影響が大である。
【０００７】
演算結果に含まれる誤差には、演算に使用される数値に含まれる誤差が大きな影響を与えることはいうまでもないが、演算方式や演算に使用される値の大小関係なども演算結果の誤差に影響を与えるため、複雑な演算が繰り返し施される一般のコンピュータプログラムにおいて演算結果に含まれる誤差を事前に予測することは簡単ではない。
【課題を解決するための手段】
【０００８】
本発明は上記事情に鑑みてなされたものであって、デジタル演算の各段階において、演算対象となる数値自体（以下これを単純に「値」と呼ぶ）と、これに含まれる誤差の指標（以下これを単純に「誤差」と呼ぶ）とを一対のデータとして扱い、値に対して演算が施されるごとに、演算結果に含まれる誤差の大きさを同時かつ自動的に演算することでこの問題を解決している。誤差の指標としては誤差の大きさに関わる統計指標を用いればよく、誤差分散、誤差の標準偏差、ないしは誤差の標準偏差の数値の値に対する比率などを用いることが可能である。各種演算結果に含まれる誤差を求める演算は誤差分散を用いた場合に最も簡素化されるため、通常は誤差分散を誤差の指標として用いることが好ましいが、誤差分散は誤差の自乗平均であることから値の範囲が広くなりオーバーフローを生じやすく、これが問題となる場合には標準偏差や標準偏差の値に対する比率がより好適となるケースもあり得る。
【０００９】
数式上は同一の結果を与える複数の演算方式をとりえる場合は、それぞれの演算方式による演算を並行して行い、得られた結果の中で最も誤差の少ないものを選択することで、より精度の高い演算が可能となる。この場合、プログラムの作成者が候補となる複数の演算方式を与えることもできるが、コンパイラもしくは前処理ソフトウエアによってソースコードを解析し、そこに記述された演算式と同等の値を算出する複数の演算方式を自動発生させることも可能である。
【発明の効果】
【００１０】
本発明になる数値演算装置を用いれば、演算結果と共に誤差の大きさを知ることができ、演算結果に対する信頼性が改善される。また、複数の演算方式を同時に実施して誤差の少ない演算結果を選択するよう装置を構成すれば、演算結果が大きな誤差を含む可能性を抑制し、精度の高い演算結果を得ることができる。
【図面の簡単な説明】
【００１１】
【図１】は本発明になる装置をハードウエアで構成した例を説明する図である。
【図２】は本発明をアプリケーションプログラムのソースコード上で実施するためのクラス定義を示す図である。
【図３】は図２で定義されたクラスに含まれるメンバ関数の本体部分を示す図である。
【図４】は、独自の浮動小数点数の表現形式を用いることで誤差分散の指数部を省略した装置を説明する図である。
【発明を実施するための形態】
【００１２】
値と誤差を対として扱う具体的手段として、（１）演算を記述するコンピュータプログラムのソースコード記述において値と誤差の組からなるデータ構造を定義して用いる方法、（２）コンパイラが変数を数値と誤差の対と解釈する方法、（３）デジタル演算器のハードウエア中で、値と誤差とを対として扱い、演算処理部分に値を処理する部分と誤差を処理する部分の双方を組み込む方法などがあり、目的に応じてこれらから適宜選択すればよい。手段（１）は最も簡単に実施することが可能だが、プログラム作成者の作業量が増加する短所がある。手段（２）は特殊なコンパイラが必要だが、プログラム作成作業が簡素化される利点がある。手段（３）では、デジタル演算器の回路規模は増大するが、値の演算と誤差の演算とにそれぞれ専用の演算器を用いることで計算時間が短縮される利点がある。
【００１３】
それぞれの変数は、変数自体の値と誤差分散の対として扱われ、変数に対して演算が施される際には、値と誤差分散の双方に対して演算を施す。各種の演算において、演算結果に含まれる誤差分散を算出する方法は広く知られているが、その一例を以下に示す。数式１は加減算の結果に含まれる誤差の分散を求める式であり、数式２は乗算結果に含まれる誤差の分散を、数式３は除算（a / b）の結果に含まれる誤差の分散を、数式４はaの平方根演算結果に含まれる誤差の分散を与える式である。いずれも入力値をaおよびb、それぞれの誤差分散をVaおよびVb、演算結果の誤差分散をVeと表記している。
【数１】
2015082152.tif 000003
【数２】
2015082152.tif 000004
【数３】
2015082152.tif 000005
【数４】
2015082152.tif 000006
【００１４】
それぞれの変数がもつ誤差分散は、その値を数値として与えることも可能だが、数値を表す文字列を数値に変換する際に誤差分散も同時に算出するのが簡便である。コンピュータプログラムのソースコードは文字で表記され、ソースコード中の定数も文字列として与えられる。また、コンピュータプログラムに入力する数値も文字列の形で与えられる。学術的な数値表記に際しては有効桁のみを文字表記することが一般的であり、これを利用すれば、数値を表記する文字列の最下位桁の重みに相当する誤差がその数値には含まれていると解釈することが可能である。最下位桁の重みは誤差の標準偏差に対応し、これを自乗すれば誤差分散となる。たとえば、十進数で小数点以下２桁まで表記されている場合は、最下位桁の重みは0.01であり、この自乗である0.0001を誤差分散として与えればよい。なお、無効桁を下位に０を連ねて表記することも行われているが、下位の0が有効数字であるか否かの判断が一意には行えないことから、このような場合は指数表記（「1.23e4」のように、小数表記に10の冪を乗じる形の表現）を用いる。最下位桁の重みは、厳密には誤差の標準偏差とは異なるが、演算結果の有効桁を知るような目的であれば、この程度の粗い見積もりでも十分に実用的である。さらに正確な誤差分散を求める必要がある場合は、値と誤差分散もしくはその標準偏差の双方を、明確な数値で、対として与えればよい。
【００１５】
誤差を含む数値を表示する際には、有効桁のみを文字列に変換して表示する。今日一般的なデジタルコンピュータにおいては、浮動小数点数の値を表示する際に、無効な桁を含めて表示することが一般的であるが、このようなやり方は利用者に無用の誤解を与えかねない。本発明の方法もしくは装置を用いて有効桁のみを表示するのであれば、利用者は表示された値を安心して利用することができる。
【実施例】
【００１６】
最も簡単に本発明を実現するには、数値と誤差を対で扱うデータ構造を定義すればよい。図２はこの一例を示すプログラムのソースリストであり、誤差を持つデータをC++のクラス“Real”のオブジェクトとして扱うことで、変数の値と誤差分散を対で扱っている。なお、このソースコードはマイクロソフト社製のVisual C++言語により記述されている。同言語に関しては非特許文献２などに詳しく述べられている。
【００１７】
図２の(1a)(1b)(1c)はクラスRealのオブジェクトを生成するためのコンストラクタである。(1a)は数値を表す文字列を与えることにより、値と誤差分散の対を発生させ、これを生成されたオブジェクトの初期値とする。コンストラクタ(1a)の本体部分(15)は図３に示されている。このプログラムは、文字列を変数の値に変換すると同時に、文字列に含まれる仮数部最下位桁の重みを求め、これを自乗することで誤差分散を得ている。(1b)は値と誤差の標準偏差の双方を与えてクラスRealのオブジェクトを形成する際に使用されるコンストラクタである。(1c)は初期値を与えず領域のみを確保する際に使用されるコンストラクタであり、各要素は0に初期化される。図２の(2)はクラスRealのオブジェクトを文字列に変換するためのメンバ関数であり、数値を有効桁のみを含む指数形式の文字列（1.2e3などの形式）に変換した結果を返す。この関数の本体(16)も図３に示されている。
【００１８】
図２の(3a)から(3d)までの部分はクラスRealに対する四則演算を定義した部分で、値（val）をそれぞれ加減乗除するとともに、演算結果の誤差分散（err）を求めている。(4a)と(4b)はクラスRealの関数を定義する部分であり、ここでは平方根と絶対値化関数の定義を行っている。ここでは一例として二つの関数定義のみを示した。アプリケーションプログラムを作成する際には他にもさまざまな関数が使用されるが、これらに対してはReal型を扱う関数を別途定義して使用する。(5)はクラスRealのメンバ変数を定義する部分で、値を格納するための倍精度浮動小数点数valと誤差分散を格納するための倍精度浮動小数点数errがここで定義されている。なお、誤差分散は値の自乗のオーダーであるため、値の指数部の絶対値が極端に大きな値をとる場合にオーバーフローもしくは0への切捨てが発生する可能性がある。誤差は値に比べれば小さいため、オーバーフローは比較的起こりにくいと考えられること、オーバーフローが発生した場合は割り込みが発生して利用者に異常の発生が通知されることから、オーバーフローの弊害は比較的軽微であるといえる。一方で、0への切捨ては、オーバーフローに比べて起こりやすい上に切捨てが発生した際にも利用者がこれを知る手段をもたず、弊害はより大きいと考えられる。0への切捨てによる問題を回避するため、演算にゼロでない誤差分散をもつ変数が使用されており、かつ演算結果の誤差分散がゼロとなった場合に、演算結果の誤差分散を浮動小数点表示可能な最小値（Visual C++の場合、この値はDBL_MINで参照される）に置き換えている。図２に示された例では、誤差分散の0への切り捨てが発生しうる箇所で、この修正を行う関数zero_chkを呼び出している。関数zero_chkの本体(14)は図３に示した。
【００１９】
図３はクラスRealに関する処理を行う関数の本体定義部分を示したもので、(14)はゼロでない誤差分散がゼロに切り捨てられることを防止するための関数zero_chkの定義、(15)は文字列を与えてクラスRealのオブジェクトを生成するためのコンストラクタ、(16)はクラスRealのオブジェクトを文字列に変換する関数ToStringの本体定義である。これらの関数定義に際しては、マイクロソフト社製のVIsual C++固有の関数を呼び出すことで記述を簡素化している。これらのVisual C++固有の関数に関しては、非特許文献２に解説がなされている。
【００２０】
クラスRealを用いる際は、それが定数もしくは初期値を持つ変数であれば「gcnew Real("数値を表現する文字列")」の形で宣言し、初期値を持たない変数（たとえばx）であれば「Real^ x = gcnew Real」の形で宣言すればよい。また、誤差分散を数値として与える際には、「Real^ x = gcnew Real(値，誤差の標準偏差)」の形で宣言して双方の初期値を対として与える。ここで、「値」は変数の値を、「誤差の標準偏差」には誤差の標準偏差の具体的値を数値で記述する。通常は、誤差の標準偏差には有効桁の最下位の重みを与えればよく、たとえば小数部が２桁（0.01の位まで有効）の場合には誤差の標準偏差として0.01を与える。誤差の指標として使用する誤差分散は、コンストラクタの内部で標準偏差を自乗することにより得ている。Real型の変数に対する演算を行う際は、図２の例では、Real型に対する四則演算子をそれぞれ定義しているので、通常の浮動小数点数に対する式と同様に、四則演算子を用いて式を記述すればよい。このようにすれば、プログラム作成者が意識することなく、値の演算と並行して誤差分散の演算を行う実行プログラムが自動的に形成される。
【００２１】
クラスRealと同様の処理は、コンパイラが自動的に行うことも可能である。コンパイラに処理を委ねる場合には、ソースコード中に記述された定数の有効桁も、コンパイラが自動的に判別して誤差分散を与えることができる。
【００２２】
演算結果に含まれる誤差を知ることは、それ自体にも演算結果の信頼性を高める上で意義があるが、さらにこの情報を用いて演算結果の精度を高めることも可能となる。数学的には同じ結果を得る演算式でも、異なる形で演算を行った際の演算誤差が異なるケースが多々ある。このような場合、双方の形式で演算を行い、得られた結果から誤差分散が最小の値を選べば、最も精度のよい結果を得ることができる。
【００２３】
演算方法により誤差が異なる良く知られた例は、二次方程式の根の公式で、二次方程式の係数を次数の高い側からa、b、cとするとき、その根の公式は下に示す数式５の形が一般的に知られているが、b絶対値がa cに比べて大きい場合、一方の根に大きな誤差が含まれる。これを改善するには、一方の根を得る際に数式６の形に変形した式を用いることで精度が改善される。
【数５】
2015082152.tif 000007
【数６】
2015082152.tif 000008
【００２４】
数式6は、bが正の場合に誤差の少ない結果を与えるが、bが負の場合は数式５が誤差の少ない結果を与える。すなわち、複数の演算方法がある場合にいずれが良い結果を与えるかは入力された数値に依存する。二次方程式の根の公式は比較的単純な形をしておりいずれの解法がよりよい結果を与えるかの判別は容易であるが、より複雑な演算式に対しては、このような判定を事前に行うことは困難である。本発明になる演算装置は、演算結果に含まれる誤差を知ることができるため、候補となる複数の演算式で演算を行って得られたそれぞれの結果から、誤差が最小となった結果を選択することで、最良の演算結果を得ることができる。
【００２５】
次に、本発明をハードウエアとして構成した例を図1に従い説明する。まず、二つのレジスタ(a)および(b)に演算の入力となる値とそれぞれの誤差分散を格納する。レジスタ(a)は、値を格納する部分(1a)、(2a)、(3a)および誤差分散を格納する部分(4a)、(4b)からなり、それぞれの部分は、符号ビット(1a)、指数部(2a)、(4a)および仮数部(3a)、(5a)から構成される。レジスタ(b)もレジスタ(a)と同様、(1b)から(5b)の各部分で構成される。それぞれのレジスタに格納された値は演算器(6)に導かれ各種演算に供され、演算結果はデータバス(8)に出力される。誤差分散演算器(7)には、それぞれのレジスタの誤差分散と値が入力され、演算の種別に応じた誤差分散が算出されてデータバス(8)に出力される。誤差分散の指数部は値の指数部に対するバイアスとして(4a)および(4b)に格納されており、これから誤差分散の指数部を得るために値の指数部(2a)および(2b)に対してベースの減算、シフト、および前記バイアスの加算が行われる。バス(8)に導かれた値と誤差分散の対は、そのままの形でレジスタもしくは主記憶装置に格納される。
【００２６】
誤差分散の演算をハードウエアで行う利点は、値の演算と誤差分散の演算にそれぞれ専用の演算器を用いて同時に行うことで、演算が高速化される点である。値の演算は、今日では64ビット幅の浮動小数点形式で行うことが一般的であるが、誤差分散にはこれほどの精度は必要なく、仮数部を2ないし8ビット幅の符号なし整数、指数部を7ビット幅の符号付整数とすることで、実用上十分な精度で誤差分散を表現することが可能である。乗除算の誤差分散を求める際にはそれぞれの誤差分散に値の自乗を乗算する演算が含まれ、値の演算に比べて複雑な演算が必要となるが、桁数が少ないことで個々の演算の所要時間は短く、値の演算に近い所要時間で誤差分散の演算を並行して行うことができる。なお、誤差分散の演算をハードウエアで行う場合にも、入力数値の有効桁の判定や有効桁のみを出力する処理の部分は、ソフトウエアによって構成することが簡便であり好ましい。
【００２７】
誤差分散は値の自乗に対応することから、その指数部の絶対値は大きな値をとり、オーバーフローや0への切捨てが生じるリスクがある。図１には、誤差分散の指数部を、誤差分散固有の指数部の値と値の指数部の二倍とを加算して与えることで、このリスクを軽減した例を示している。図１に示す例では、値の浮動小数点表現にIEEE754に規定された倍精度浮動小数点表現を用いることを前提としている。この場合、指数部には1023の下駄を履いた値（baseを加算した値）が格納されている。これを調整するためにbaseの減算が行われる。次に、誤差分散は自乗形式で表されているため、値の指数部を二倍して誤差分散の指数部にあわせる。これを誤差分散固有の指数部(4a)に加算することで誤差分散の指数部を形成している。図には示していないが、演算結果の誤差分散の指数部は、誤差分散の演算結果から値の指数部の二倍を差し引いた値を出力する。
【００２８】
IEEE754に規定された浮動小数点表現は、常に仮数部の最上位が1となるよう規格化を行っており、仮数部のいずれのビットが有効桁であるかは一概には定まらず、誤差分散固有の指数部(4a)および(4b)は値の仮数部の有効桁位置によって変動する。浮動小数点表現として、仮数部の有効桁位置を常に一定に保つ浮動小数点表現を採用すれば、誤差分散固有の指数部はほぼ一定となり、値の指数部から算出される指数部を誤差分散の指数部とし、誤差分散固有の値は仮数部(5a)および(5b)のみとすることも可能である。
【００２９】
図４は図１に示した演算装置にこの改良を施した例であり、値の指数部(2a)を二倍したものを誤差分散の指数部として用い、誤差分散の指数部を格納するレジスタを省略している。この手法においては、値の仮数部の有効桁が所定の位置となるよう、値を演算する際に正規化が行われる。図４に太線で示した誤差分散の演算器(7)から値の演算器(6)に向かうパスはこのためのものであり、演算された誤差分散の仮数部が所定の範囲に収まるように2nビットのシフトを行うと共に、nを値の演算器に通知して値のシフトと指数部の調整を行っている。なお、図４には、値の指数部も仮数部も符号付数で表現することで、値の符号ビット(1a)および(2a)と指数部へのbase加算を省略した例を示している。
【産業上の利用可能性】
【００３０】
以上詳細に説明したように、本発明の手法を用いれば、プログラムの作成者にさほどの負担をかけることなく、演算結果とその誤差を同時に知ることが可能となり、数値演算結果の適切な利用が容易となる。また、誤差情報を用いて演算手段を選択するよう演算方法を構成することも可能であり、より高い精度の演算手法を自動的に選択することが可能となる。
【符号の説明】
【００３１】
図１ないし図４における符号の意味は以下のとおりである。
(a)第一のレジスタ
(b)第二のレジスタ
(1a)および(1b)値の符号
(2a)および(2b)値の指数部
(3a)および(3b)値の仮数部
(4a)および(4b)誤差分散固有の指数部
(5a)および(5b)誤差分散の仮数部
(6)値の演算器
(7)誤差分散の演算器
(8)データバス接続部
(9a)文字列を引数とするコンストラクタの型宣言
(9b)値と誤差の標準偏差を引数とするコンストラクタ
(9c)ゼロで初期化するコンストラクタ
(10)文字列化関数のオーバーライド型宣言
(11a)加算演算子に対応する関数定義
(11b)減算演算子に対応する関数定義
(11c)乗算演算子に対応する関数定義
(11d)除算演算子に対応する関数定義
(12a)平方根関数定義
(12b)絶対値化関数定義
(13)クラスRealのメンバ変数宣言
(14)誤差分散の0への切捨てを防ぐための関数の本体定義
(15)文字列を引数とするコンストラクタの本体定義
(16)文字列化関数の本体定義
【図１】
2015082152.tif 000009
【図２】
2015082152.tif 000010
【図３】
2015082152.tif 000011
【図４】
2015082152.tif 000012