【解決手段】入力値の指数部に基づき、指数の異なる複数の値がそれぞれ格納される複数のバッファから、前記入力値に対応するバッファを選択する選択部により選択されたバッファに格納されている値と前記入力値とに基づき加減演算した結果を前記バッファに書き込む加減演算部と、複数の入力値に基づく加減演算の出力値を決定する出力決定部と、前記入力値を格納するバッファが用意されていないと判定した場合、前記入力値に対応するバッファを追加するバッファ管理部とを備え、前記加減演算部は、前記加減演算した結果の有効桁数が前記選択部により選択されたバッファの有効桁数を超える場合、前記加減演算した結果の一部を繰り上げ又は繰り下げて、複数のバッファに格納される値に分割する。
【発明を実施するための形態】
【0017】
以下、図面を参照し、本発明に係る演算装置の実施形態について説明する。本実施形態では、CFDによる解析処理を実行する演算装置1について説明する。
図1,2を参照して、演算装置1について説明する。
図1は、演算装置1の構成例を示すブロック図である。
図2は、物体周りを流れる流体のパラメータの演算について説明するための参考図である。
図1に示す通り、演算装置1は、初期処理部2と、パラメータ算出部3と、時間方向加減演算部4と、空気抵抗値演算部5と、収束判定部6とを備える。
【0018】
初期処理部2は、CFDによる解析処理の初期処理を行う。
はじめに、初期処理部2は、
図2(A)に示すような、物体Oと計算領域Rとを設定する。図示の例では、物体Oは翼であり、計算領域Rは、XYZ軸方向に広がる空間である。計算領域Rは、計算したい物体周りの流れを表わす場であって、入口境界L1と、出口境界L2と、上面境界L3と、下方境界L4とで囲まれた領域である。
次いで、初期処理部2は、
図2(B)に示すような格子を、計算領域R内に設定する。初期処理部2は、図示の通り、流体現象を解く場所に網目状の格子を設定し、網目同士が交差する点(以下、格子点という)を設定する。なお、物体Oの表面の法線ベクトルは、物体Oの形状が決まることでおのずと決まる。初期処理部2は、例えば、法線ベクトルの方向に対数関数の刻みで基準幅ずつ伸ばした線により、格子の網目を設定する。
【0019】
初期処理部2は、
図2(C)に示すように、境界条件を設定する。実施形態において、初期処理部2は、入口境界L1における条件、出口境界L2における条件、上面境界L3における条件、及び、下方境界L4における条件として、各境界における物理的意味を再現するための条件値を設定する。
初期処理部2は、
図2(D)に示すように、各格子点の初期条件を設定する。実施形態において、初期処理部2は、各格子点上に、解ベクトルの値を設定する。解ベクトルとは、密度、運動量、全エネルギーのベクトルである。
【0020】
パラメータ算出部3は、所定の計算式に基づいて計算単位(格子)ごとの流体のパラメータ(保存量)を算出する。実施形態において、パラメータ算出部3は、流体のパラメータとして、解ベクトルを算出する。また、パラメータ算出部3は、例えば、Δtだけ時間を進めることで解ベクトルを更新し、解ベクトルの時間積分を実施する。
【0021】
時間方向加減演算部4は、パラメータ算出部3により算出された計算単位(格子)ごとの流体のパラメータ(保存量)を時間方向に加減演算する。本実施形態において、時間方向加減演算部4は、収束判定部6により空気抵抗値(Cd(Constant Drag)値)の時間方向の変化量が収束したと判定した場合、収束したと判定した後にパラメータ算出部3が算出した解ベクトルを時間方向に加減演算する。
時間方向加減演算部4は、各格子に対応する演算部100を複数備え、各演算部100が、計算単位(格子)ごとの流体のパラメータを時間方向に加減演算する。また、時間方向加減演算部4は、複数の演算部100の演算結果に対してさらに加減演算をする全体処理部12を備える。なお、演算部100と全体処理部12については、
図4を参照して後述する。
【0022】
また、時間方向加減演算部4は、パラメータ算出部3により算出された計算単位(格子)ごとの空気抵抗値(Cd値)を時間方向に加減演算する。本実施形態において、時間方向加減演算部4は、収束判定部6により空気抵抗値(Cd値)の変化量が収束したと判定した場合、収束したと判定した後に算出した空気抵抗値(Cd値)を時間方向に加減演算する。
時間方向加減演算部4は、流体のパラメータの加減演算とは異なる演算部100を格子ごとに備え、各演算部100が、計算単位(格子)ごとの空気抵抗値(Cd値)を時間方向に加減演算する。また、時間方向加減演算部4は、これら演算部100による空気抵抗値(Cd値)の演算結果に対してさらに加減演算をする全体処理部12を備える。
【0023】
空気抵抗値演算部5は、物体Oに作用する空気抵抗値(Cd値)を算出する。空気抵抗値演算部5は、物体Oの表面の圧力、物体Oの表面の法線ベクトル、及び求めたい抵抗の向きから、空気抵抗値(Cd値)を求める。なお、物体Oの表面の圧力は、解ベクトルの密度、運動量、全エネルギーのベクトルから求められる。
【0024】
収束判定部6は、空気抵抗値演算部5により算出された空気抵抗値(Cd値)の収束度合いを判定する。Δtだけ時間を進めるとき、更新された空気抵抗値(Cd値)は、初めのころにばらつき、その後収束する。収束判定部6は、Δtだけ時間を進めたときの前後において、空気抵抗値(Cd値)を比較する。Δt時間経過の前後において、空気抵抗値(Cd値)の差分が閾値以下である場合、又は、空気抵抗値(Cd値)の差分が閾値以下となる状態が所定の時間だけ続いた場合、収束したと判定する。
【0025】
ここで、パラメータ算出部3により解ベクトルを求めるための演算例について説明する。
パラメータ算出部3は、例えば、以下に示す保存形のナビエ・ストークス方程式の偏微分を差分として扱うことによって、解ベクトルを求める。
【0027】
ここで、t、xおよびReは、それぞれ、時間、座標およびレイノルズ数である。i、jおよびkは、上記および以下の方程式において、座標インデックスを表し、アインシュタインの総和則がそれぞれのインデックスに適用される。保存変数ベクトルU、非粘性フラックス・ベクトルF(U)および粘性フラックス・ベクトルG(U)は、
【0028】
【数2】
によって定義される。ここで、ρ, p, e,TおよびKは、密度、圧力、全エネルギー、温度および流体の熱伝導率であり、u
iは、座標方向における流れの速度成分を表す。この方程式のセットは、完全気体の状態方程式によって閉じられる。
【0029】
【数3】
ここでγは、比熱の比率である。粘性応力テンソルの成分τ
ijは、
【0030】
【数4】
によって与えられる。ここでδ
ijは、クロネッカーのデルタ記号であり、μは、サザランドの関係によって定まる粘性係数である。
【0031】
次に、
図3を参照して、演算装置1による処理について説明する。
図3は、演算装置1による処理例を説明するためのフローチャートである。
はじめに、初期処理部2は、物体Oと計算領域Rとを設定し(ステップST1)、格子を計算領域R内に設定する(ステップST2)。初期処理部2は、境界条件を設定し(ステップST3)、各格子点の初期条件を設定する(ステップST4)。
次いで、パラメータ算出部3は、CFD解析処理を実行する(ステップST5)。例えば、パラメータ算出部3は、所定の計算式に基づいて格子ごとの解ベクトルを算出すると共に、解ベクトルの時間積分を実施する。
演算装置1は、後処理を実行する(ステップST6)。演算装置1は、時間方向に解ベクトルを算出する反復回数が上限値に達したか否かを判定する(ステップST7)。演算装置1は、反服回数が上限値に達するまで、CFD解析処理と後処理とを繰り返し実行する。
【0032】
次に、ステップST6の後処理について説明する。
パラメータ算出部3は、算出した解ベクトルに基づき、Δt後に再び実行されるCFD解析処理のためのリスタート用データを生成し、例えば一次記憶部(図示せず)に出力する(ステップST8)。
また、パラメータ算出部3は、算出した解ベクトルに基づき、可視可用データを生成し、例えば一次記憶部(図示せず)に出力する(ステップST9)。
そして、パラメータ算出部3は、統計量を算出し、例えば一次記憶部(図示せず)に出力する(ステップST10)。
【0033】
次に、ステップST10の統計量の算出処理について説明する。
パラメータ算出部3は、L2/infノルム値を算出し、例えば一次記憶部(図示せず)に出力する(ステップST11)。
空気抵抗値演算部5は、物体Oに作用する空気抵抗値(Cd値)を算出し、収束判定部6に出力する(ステップST12)。
収束判定部6は、空気抵抗値演算部5により算出された空気抵抗値(Cd値)に基づき、空気抵抗値(Cd値)の時間方向の変化量が収束したか否かを判定する(ステップST13)。
空気抵抗値(Cd値)が収束したと判定しない場合、パラメータ算出部3は、収束判定部6の判定結果に基づき、ステップST10の処理を終了し、ステップST7の処理に移行する。
【0034】
一方、空気抵抗値(Cd値)が収束したと判定した場合、時間方向加減演算部4は、平均値の算出を開始する(ステップST14)。
例えば、時間方向加減演算部4は、複数の演算部100を利用して、空気抵抗値演算部5が算出した複数の空気抵抗値(Cd値)を時間方向に加減演算し、加減演算の演算結果に基づき空気抵抗値(Cd値)の平均値を求める(ステップST15)。
また、時間方向加減演算部4は、複数の演算部100を利用して、パラメータ算出部3が算出した複数の解ベクトルを時間方向に加減演算し、加減演算の演算結果に基づき解ベクトルの平均値を求める(ステップST16)。
なお、ステップST6の後処理や、ステップST10の統計量の算出処理、ステップST14の平均値算出処理については、それぞれ実施形態以外の処理を含めてもよい。
【0035】
なお、計算領域Rを複数の計算領域R1,R2,R3…に分割して、分割された計算領域ごとに平均値を算出してもよい。
図4は、本実施形態に係る演算装置1による処理例について説明するための図である。
演算装置1は、コンピュータ・クラスターを用いて並列処理によるシミュレーションを実行する。演算装置1は、例えば複数の演算部100_1,100_2,100_3…を備える。なお、複数の演算部は、それぞれコンピュータ・クラスターのノードである。
演算部100_1,100_2,100_3…は、それぞれ、分割された計算領域R1,R2,R3…ごとに、空気抵抗値(Cd値)の平均値や解ベクトルの平均値を求める。
【0036】
図示の例では、演算部100_1の加減演算により、バッファ領域1071〜1073に演算結果が格納されている。演算部100_2の加減演算により、バッファ領域1073〜1075に演算結果が格納されている。演算部100_3の加減演算により、バッファ領域1072〜1074に演算結果が格納されている。
全体処理部12は、複数の演算部100_1,100_2,100_3…のそれぞれにおけるバッファの指数に基づき、各演算部から取得する出力値の指数を決定する。全体処理部12は、予め決められた設定値に基づき出力値の指数を決定してもよく、演算結果が記憶されている各演算部のバッファ領域に基づき出力値の指数を決定してもよい。なお、後者の場合、全体処理部12は、複数の演算部100_1,100_2,100_3…の全体において、演算結果が記憶されているバッファ領域の数が多い順に、出力値の指数を決定してもよい。図示の例では、演算部100_1,100_2,100_3…の全体において、全てのバッファ領域1073に演算結果が記憶されているため、全体処理部12は、バッファ領域1073より上位の3つのバッファ領域1071,1072,1073の指数部を、出力値の指数部と決定してもよい。この場合、全体処理部12は、演算部100_1,100_2,100_3…のうち、バッファ領域1071,1072,1073に格納されている情報を指数毎に加減演算して、得られた演算結果に基づき平均値を算出する。
このように、分割された計算領域R1,R2,R3…ごとに精度の高い演算結果を得ることができるため、全体処理部12としても、精度の高い演算結果を得ることができる。
【0037】
また、全体処理部12は、出力値の指数を決定する場合、複数の演算部100_1,100_2,100_3…から演算結果の入力を受け付けるのではなく、各演算部において演算結果が格納されているバッファ領域の識別情報だけの入力を受け付ける。
全体処理部12は、複数の演算部100_1,100_2,100_3…からのバッファ領域の識別情報に基づき、出力値の指数を決定する。全体処理部12は、決定した出力値の指数を示す情報を、演算部100_1,100_2,100_3…のそれぞれに送信する。演算部100_1,100_2,100_3…は、全体処理部12からの出力値の指数に相当するバッファ領域から演算結果を読み出し(抽出し)、読み出した演算結果を全体処理部12に出力する。
例えば、全体処理部12がバッファ領域1071,1072,1073を示す識別情報を演算部100_1,100_2,100_3に出力した場合、演算部100_1がバッファ領域1072〜1074に格納されている演算結果を読み出し、演算部100_2がバッファ領域1073,1074に格納されている演算結果を読み出し、演算部100_3がバッファ領域1072,1073に格納されている演算結果を読み出し、全体処理部12に出力する。
これにより、全体処理部12は、出力値に必要な指数部の情報だけを、複数の演算部100_1,100_2,100_3…から得ることができる。よって、全体処理部12による処理負荷を軽減し、複数の演算部100_1,100_2,100_3…と全体処理部12とでやり取りされる情報量を削減できる。
【0038】
次に、
図5を参照して、浮動小数点演算装置10の一例について説明する。
図5は、浮動小数点演算装置10の一例を示す図である。
浮動小数点演算装置10は、複数の演算部100を備える部分処理部11と、全体処理部12とを備える。実施形態において、部分処理部11に含まれる複数の演算部100は、それぞれ同じ機能を有する構成であって、例えば、1つの処理基板である。部分処理部11は、処理基板である演算部100を複数備えたコンピュータ・クラスターである。複数の演算部100はそれぞれ、全体処理部12と接続されており、演算結果を全体処理部12に出力する。全体処理部12は、複数の演算部100からの出力に基づき1つの演算結果を求める。
【0039】
次に、
図6を参照して、演算部100に入力する入力値の一例について説明する。
図6は、演算部100に入力する入力値のデータ形式の一例を示した図である。
演算部100に入力する入力値は、例えば浮動小数点のデータ形式で表現される情報である。実施形態において、入力値は、IEEE(Institute of Electrical and Electronics Engineers)方式のデータであって、符号部Sと、指数部eと、仮数部fとを備える。なお、符号部Sは、1ビットであり、指数部eと仮数部fのビット長は、演算部100により採用されているフォーマットに応じて決められている。実施形態において、演算部100が処理する浮動小数点の指数部eと仮数部fのビット長は、全て同じ長さである。
なお、演算部100に入力するときに浮動小数点のデータ形式でない場合、演算部100は、入力した値を浮動小数点のデータ形式に変換し、浮動小数点演算を実行する。
【0040】
次に、
図7を参照して、演算部100の構成例について説明する。
図7は、演算部100の構成例を示すブロック図である。
演算部100は、制御部101と、バッファ部107と、バッファテーブル108とを備える。制御部101は、例えば、CPU(Central Processing Unit)であって、演算部100の動作を統括的に制御する制御部である。演算部100は、CPUである制御部101がプログラムを実行することにより機能する機能部として、入力値取得部102と、バッファ管理部103と、選択部104と、加減演算部105と、出力決定部106と、を備える。これら機能部の一部又は全部は、LSI(Large Scale Integration)やASIC(Application Specific Integrated Circuit)などのハードウェア機能部であってもよい。
実施形態において、加減演算部105が処理可能な数値の指数と有効桁数は、予め決められている。また、バッファ部107に形成されるバッファ領域の指数と有効桁数も、加減演算部105が処理可能な数値に応じて予め決められている。以下、バッファ部に形成されるバッファの領域に対して予め決められた指数を、設定指数という。バッファ部には、例えば、設定指数「+32」「+16」「+00」「−16」「−32」のそれぞれに対応するバッファ領域が用意される。
【0041】
入力値取得部102は、入力値を取得し、バッファ管理部103と、選択部104と、加減演算部105とに、それぞれ出力する。入力値取得部102は、前処理の構成部から出力された情報を順次入力値として取得してもよく、所定の記憶領域に記憶されている入力値を順次1つずつ読み出して取得してもよい。
【0042】
バッファ管理部103は、バッファテーブル108を参照して、バッファ部107に含まれるバッファ領域のうち、加減演算部105により利用されるバッファ領域を管理する。バッファ管理部103は、入力値の指数部eに対応する設定指数のバッファ領域が用意されていない場合、入力値の指数部eに対応する設定指数のバッファ領域を追加する。
バッファ管理部103は、バッファテーブル108を参照して、入力値の指数部e及び有効桁数がバッファの設定指数及び有効桁数との範囲内となるように、入力値を変換(分散)し、選択部104と加減演算部105とに出力する。
例えば、入力値の指数部eがバッファの設定指数の範囲内でない場合、バッファ管理部103は、入力値の指数部eがバッファの設定指数となる浮動小数点へ、入力値を変換する。指数部eを変換した後の入力値の有効桁数がバッファの有効桁数の範囲外となる場合、バッファ管理部103は、入力値をそれぞれ異なる指数部eの浮動小数点に分割して、バッファの設定指数及び有効桁数の範囲内となる数値に変換する。
【0043】
具体的に説明すると、入力値の指数部eが「−15」であった場合、バッファ管理部103は、入力値の指数部eがバッファの設定指数(例えば、「+00」「−16」)の範囲内でないと判定する。この場合、バッファ管理部103は、入力値の仮数部fに基づき、指数部eが「+00」又は「−16」となる浮動小数点へ、入力値を変換する。例えば、入力値の指数部eがバッファの設定指数「−16」となる浮動小数点へ変換し、変換後の入力値の有効桁数がバッファの有効桁数である「16」を超えた場合、バッファ管理部103は、入力値を、指数部e「+00」と指数部e「−16」の値、あるいは、指数部e「−16」と指数部e「−32」の値に分割する。つまり、入力値が、バッファの指数部や有効桁数の範囲を跨いでいる場合、バッファ管理部103は、入力値を分割して、加減演算部105により加減演算される指数部の範囲内に含まれる浮動小数点に変換する。
【0044】
選択部104は、入力値の指数部eに基づき、複数のバッファ領域1071〜1075の中から、入力値に対応するバッファ領域を選択する。実施形態において、選択部104は、バッファテーブル108を参照して、入力値の指数部eに対応するバッファ領域のアドレスを読み出し、読み出したアドレスに対応するバッファ領域1071〜1075を、入力値の指数部eに対応するバッファ領域として選択する。
【0045】
加減演算部105は、選択部104により選択されたバッファ領域に格納されている値と、入力値取得部102が取得した入力値とに基づき加減演算した結果を、選択部104により選択されたバッファ領域に書き込む。バッファ領域に既に値が保存されている場合、加減演算部105は、最新の演算結果を上書きする。
【0046】
出力決定部106は、バッファ部107に格納された値に基づき、複数の入力値に基づく加減演算の結果を決定する。実施形態において、出力決定部106が出力する情報のビット数が決められている。バッファ領域1071〜1075のうちいずれか1つに格納されている情報のビット数が、出力決定部106が出力可能な出力値のビット数と決められている。よって、出力決定部106は、1以上の数字が格納されているバッファ領域1071〜1075のうち最も上位のバッファ領域から読み出した情報を、出力値として決定する。例えば、バッファ領域1071〜1075のうち設定指数「+00」「−16」「−32」のバッファ領域に1以上の数字が格納されている場合、出力決定部106は、設定指数「+00」「−16」「−32」のうち最も上位の設定指数「+00」のバッファ領域に格納されている情報を出力値に決定する。なお、設定指数「+00」のバッファ領域に格納されている情報が「0」である場合、出力決定部106は、次に上位の「−16」のバッファ領域に格納されている情報を、出力値に決定する。
【0047】
バッファ部107は、バッファアドレスが割り当てられた複数のバッファ領域1071〜1075…を備える。複数のバッファ領域1071〜1075…は、例えば、RAM上に設定される。バッファ領域1071〜1075は、予め決められた容量毎に区分される領域であって、指数の異なる複数の値がそれぞれ格納されるバッファである。
実施形態において、バッファ領域1071〜1075の容量は、加減演算部105によって処理されるデータの有効桁数に応じて予め決められている。バッファ領域1071は、指数部e「+32」の値を格納するバッファである。バッファ領域1072は、指数部e「+16」の値を格納するバッファである。バッファ領域1073は、指数部e「+00」の値を格納するバッファである。バッファ領域1074は、指数部e「−16」の値を格納するバッファである。バッファ領域1075は、指数部e「−32」の値を格納するバッファである。
【0048】
バッファテーブル108は、バッファ領域の設定指数、有効桁数、割り当てられた領域のアドレス等を示す情報を格納するテーブルである。バッファテーブル108は、例えば、制御部101のCPUに付設されたレジスタ上に設定される。
【0049】
次に、
図8を参照して、バッファテーブル108の一例について説明する。
図8は、バッファテーブル108の一例を示す図である。
バッファテーブル108は、例えば、バッファの設定指数を示す情報と、バッファの有効桁数を示す情報と、バッファのアドレスを示す情報とを対応付けて格納するテーブルである。
バッファの設定指数とは、各バッファ領域1071〜1075が格納するデータの指数を示す情報である。バッファの設定指数は、加減演算部105が演算する浮動小数点の指数に応じて予め決められている。実施形態において、バッファの設定指数は「+32」「+16」「+00」「−16」「−32」である。
バッファの有効桁数とは、各バッファ領域1071〜1075が格納するデータの有効桁数の上限値を示す情報である。実施形態において、バッファの有効桁数の上限値は、バッファ領域の全てにおいて、「16」である。
バッファのアドレスとは、バッファ部107において、各バッファ領域1071〜1075の位置を示す情報である。バッファのアドレスにバッファ領域の位置を示す情報が登録されている場合、当該バッファが加減演算部105のバッファとして割り当てられていることを意味している。
【0050】
次に、
図9を参照して、演算部100による処理について説明する。
図9は、演算部100による処理例を説明するためのフローチャートである。
入力値取得部102は、順次入力値を取得する(ステップST101)。入力値取得部102は、取得した入力値を、バッファ管理部103と、選択部104と、加減演算部105とに、それぞれ出力する。例えば、入力値取得部102は、入力値として数値データD1(一例として、1.000100010001000E+00)を取得し、数値データD1を、バッファ管理部103と、選択部104と、加減演算部105とに、それぞれ出力する。この数値データD1は、符号部Sに「+」を示す情報、指数部eに「+00」を示す情報、仮数部fに「1000100010001000」を示す情報を、それぞれ含む。仮数部fの有効桁数は「16桁」である。
【0051】
バッファ管理部103は、バッファテーブル108を参照して、入力値の指数部eがバッファの設定指数の範囲内か否かを判定する(ステップST102)。実施形態において、バッファ管理部103は、入力値である数値データD1の指数部e「+00」と一致する設定指数がバッファテーブル108に含まれるか否かを判定する。バッファテーブル108には、バッファの設定指数「+00」が定義されている。つまり、数値データD1の指数部e「+00」と一致する設定指数がバッファテーブル108に含まれる。この場合、バッファ管理部103は、数値データD1の指数部eがバッファの設定指数の範囲内であると判定する。
【0052】
入力値の指数部eがバッファの設定指数の範囲内であると判定した場合(ステップST102:YES)、バッファ管理部103は、バッファテーブル108を参照して、入力値の指数部eに対応するバッファ領域が用意されているか否かを判定する(ステップST103)。実施形態において、バッファ管理部103は、数値データD1の指数部e「+00」と一致するバッファテーブル108の設定指数に、バッファのアドレスが対応付けられているか否かを判定する。バッファテーブル108には、バッファの設定指数が「+00」であるバッファ領域のアドレスが書き込まれていないとする。この場合、バッファテーブル108において設定指数「+00」に対応するバッファのアドレスが用意されていないことを意味している。よって、バッファ管理部103は、入力値である数値データD1の指数部eに対応するバッファ領域が用意されていないと判定する。
【0053】
入力値の指数部eに対応するバッファ領域が用意されていないと判定した場合(ステップST103:NO)、バッファ管理部103は、入力値である数値データD1の指数部eに対応するバッファ領域を追加する(ステップST104)。バッファ管理部103は、数値データD1の指数部eに基づき、数値データD1の指数部eに対するバッファ領域を割り当て、割り当てたバッファのアドレスをバッファテーブル108に書き込む。実施形態において、バッファ管理部103は、数値データD1の指数部e「+00」に対するバッファ領域として、バッファ領域1073を割り当てる。バッファ管理部103は、数値データD1の指数部eに対するバッファ領域として割り当てたバッファ領域1073のアドレスを示す情報を、バッファテーブル108において、設定指数「+00」に対応するバッファのアドレスの欄に書き込む。これにより、入力値の指数部e「+00」に対応するバッファ領域1073が追加される。
バッファ管理部103は、設定指数「+00」に対応するバッファ領域が追加されたことを選択部104に通知する。
【0054】
選択部104は、バッファテーブル108を参照して、入力値の指数部eに対応するバッファ領域のアドレスを読み出し、入力値の指数部eに対応するバッファアドレスを選択する(ステップST105)。入力値の指数部eに対応するバッファ領域のアドレスが登録されていない場合、選択部104は、バッファ管理部103からバッファ領域が追加されたことの通知を受けた後、バッファテーブル108を参照して、入力値の指数部eに対応するバッファ領域のアドレスを読み出し、入力値の指数部eに対応するバッファ領域1073を選択する。選択部104は、選択したバッファ領域1073を示す情報を、加減演算部105に出力する。
加減演算部105は、選択部104により選択されたバッファ領域1073に数値データD1を書き込む(ステップST106)。
【0055】
次いで、入力値取得部102が、入力値として、数値データD2(一例として、2.000200020002000E+00)を取得し、取得した数値データD2を、バッファ管理部103と、選択部104と、加減演算部105とに、それぞれ出力する。この数値データD2は、符号部Sに「+」を示す情報、指数部eに「+00」を示す情報、仮数部fに「200020002000200」を示す情報を、それぞれ含む。仮数部fの有効桁数は「16桁」である。
【0056】
上述の通り、バッファ管理部103は、数値データD1を記憶する際に、設定指数「+00」のバッファ領域1073を追加している。従って、ステップST103の判定において、バッファ管理部103は、数値データD2の指数部e「+00」に対応するバッファ領域1073が用意されていると判定する(ステップST103:YES)。バッファ管理部103は、判定結果を選択部104に出力する。
数値データD2の指数部e「+00」に対応するバッファ領域1073が用意されていると判定された場合、選択部104は、バッファテーブル108を参照して、入力値の指数部e「+00」に対応するバッファ領域のアドレスを読み出し、入力値の指数部eに対応するバッファ領域1073を選択する(ステップST107)。選択部104は、選択したバッファ領域1073を示す情報を加減演算部105に出力する。
【0057】
加減演算部105は、選択部104により選択されたバッファ領域1073から、格納されているバッファの値を読み出す(ステップST108)。実施形態において、バッファ領域1073には数値データD1が格納されているため、加減演算部105は、数値データD1を読み出す。
そして、加減演算部105は、読み出した数値データD1と、入力値である数値データD2とに基づき加減演算をする(ステップST109)。実施形態において、加減演算部105は、数値データD1と数値データD2とを加算し、演算結果(D1+D2=3.000300030003000E+00)を得る。
【0058】
ステップST102において、入力値の指数部eがバッファの設定指数の範囲内でないと判定した場合(ステップST102:NO)、バッファ管理部103は、バッファテーブル108を参照して、入力値の指数部eと有効桁数がバッファの設定指数と有効桁数の範囲内となるように、入力値を変換し、選択部104と加減演算部105とを出力する(ステップST110)。入力値の指数部eがバッファの設定指数の範囲内でない場合、バッファ管理部103は、入力値の指数部eをバッファの設定指数となる浮動小数点へ変換する。指数部eを変換した後の入力位置の有効桁数がバッファの有効桁数の範囲外となる場合、バッファ管理部103は、入力値をそれぞれ異なる指数部eの値に分割して、バッファの設定指数及び有効桁数の範囲内となる数値に変換する。
【0059】
次いで、
図10を参照して、演算部100による処理の続きについて説明する。
図10は、
図9に示す処理例の続きを説明するためのフローチャートである。
ステップST109の処理の後、加減演算部105は、バッファテーブル108を参照して、演算結果の有効桁数がバッファの有効桁数を超えるか否かを判定する(ステップST111)。実施形態において、加減演算部105は、バッファテーブル108を参照して、ステップST107において選択部104により選択されたバッファ領域1073の有効桁数「16」を得る。加減演算部105は、演算結果の有効桁数がバッファ領域1073の有効桁数「16」を超えるか否かを判定する。演算結果(D1+D2=3.000300030003000E+00)の有効桁数は「16」であるため、加減演算部105は、バッファ領域1073の有効桁数「16」を超えないと判定する。
【0060】
演算結果の有効桁数がバッファの有効桁数を超えないと判定された場合(ステップST111:NO)、加減演算部105は、演算結果(3.000300030003000E+00)をバッファ領域1073に上書きする(ステップST112)。
【0061】
次いで、入力値取得部102が、入力値として、数値データD3(一例として、7.000700070007000E+00)を取得し、取得した入力値D3を、バッファ管理部103と、選択部104と、加減演算部105とに、それぞれ出力したとする。この入力値D3は、符号部Sに「+」を示す情報、指数部eに「+00」を示す情報、仮数部fに「7000700070007000」を示す情報を、それぞれ含む。仮数部fの有効桁数は「16」である。
【0062】
上述の通り、設定指数「+00」のバッファ領域1073は、数値データD1を記憶する際に選択部104によって追加されている。従って、ステップST103の判定において、選択部104は、数値データD3の指数部e「+00」に対応するバッファ領域1073が用意されていると判定する(ステップST103:YES)。そして、選択部104は、設定指数「+00」のバッファ領域1073を選択する(ステップST107)。
次いで、加減演算部105は、選択部104により選択されたバッファ領域1073から、格納されているバッファの値を読み出す(ステップST108)。実施形態において、バッファ領域1073には数値データD1+D2の演算結果が格納されているため、加減演算部105は、演算結果(D1+D2)を読み出す。
そして、加減演算部105は、読み出した演算結果(D1+D2)と、入力値である数値データD3とに基づき加減演算をする(ステップST109)。実施形態において、加減演算部105は、演算結果(D1+D2)と数値データD3とを加算し、演算結果A(D1+D2+D3=10.001000100010000E+00)を得る。
加減演算部105は、バッファテーブル108を参照して、演算結果の有効桁数がバッファの有効桁数を超えるか否かを判定する(ステップST111)。実施形態において、演算結果A(D1+D2+D3=10.001000100010000E+00)の有効桁数は「17」であるため、加減演算部105は、バッファ領域1073の有効桁数「16」を超えていると判定する。
【0063】
演算結果の有効桁数がバッファの有効桁数を超えていると判定された場合(ステップST111:YES)、加減演算部105は、演算結果A(10.001000100010000E+00)をバッファの有効桁数の範囲内となる値に変換する(ステップST113)。実施形態において、加減演算部105は、演算結果A(10.001000100010000E+00)のうちバッファの設定指数及び有効桁数の範囲から外れる値を、繰り上げ又は繰り下げることにより、演算結果A(10.001000100010000E+00)を、繰り上げ後又は繰り下げ後の指数部eのデータと、繰り上げ前又は繰り下げ前の指数部eのデータとに分割する。
具体的に説明すると、加減演算部105は、演算結果A(10.001000100010000E+00)のうちバッファの設定指数及び有効桁数の範囲から外れる値A1(10.000000000000000E+00)と、バッファの設定指数及び有効桁数の範囲内の値A2(0.001000100010000E+00)と、に分割する。なお、加減演算部105は、演算結果Aの指数部eとバッファの設定指数に基づき、演算結果Aのうちバッファの有効桁数の範囲から外れる値A1を決定する。また、加減演算部105は、バッファの有効桁数の範囲から外れる値A1(10.000000000000000E+00)を上位の設定指数に対応する値に繰り上げて、繰り上げ後の値A1´(0.000000000000001E+16)に変換する。つまり、加減演算部105は、演算結果A(10.001000100010000E+00)を、繰り上げ後の指数部e「+16」に対応する演算結果A1´(0.000000000000001E+16)と、繰り上げ前の指数部e「+00」に対応する演算結果A2(0.001000100010000E+00)とに変換する。
【0064】
そして、加減演算部105は、繰り上げ前又は繰り下げ前の指数部e「+00」に対応する演算結果A2(0.00100010001000E+00)を、設定指数「+00」のバッファ領域1073に上書きする(ステップST114)。
【0065】
次いで、バッファ管理部103は、バッファテーブル108を参照して、繰り上げ後又は繰り下げ後の設定指数「+00」に対応するバッファ領域が用意されているか否かを判定する(ステップST115)。実施形態において、バッファ管理部103は、繰り上げ後の演算結果A´の指数部e「+16」と一致するバッファテーブル108の設定指数に、バッファのアドレスが対応付けられているか否かを判定する。バッファテーブル108には、バッファの設定指数が「+16」であるバッファ領域のアドレスが定義されていないとする。この場合、バッファテーブル108において指数部e「+16」に対応するバッファ領域が用意されていないことを意味している。よって、選択部104は、繰り上げ後の演算結果A1´(0.000000000000001E+16)の指数部e「+16」に対応するバッファ領域が用意されていないと判定する。
【0066】
演算結果の指数部eに対応するバッファ領域が用意されていないと判定した場合(ステップST115:NO)、バッファ管理部103は、演算結果の指数部eに対応するバッファ領域を追加する(ステップST116)。バッファ管理部103は、演算結果A1´(0.000000000000001E+16)の指数部e「+16」に基づき、演算結果A´の指数部eに対応するバッファ領域を割り当て、割り当てたバッファ領域のアドレスをバッファテーブル108に書き込む。実施形態において、バッファ管理部103は、演算結果A1´(0.000000000000001E+16)の指数部e「+16」に対するバッファ領域として、バッファ領域1072を割り当てる。バッファ管理部103は、演算結果A1´(0.000000000000001E+16)の指数部e「+16」に対するバッファ領域として割り当てたバッファ領域1072のアドレスを示す情報を、バッファテーブル108において、設定指数「+16」に対応するバッファのアドレスの欄に書き込む。これにより、入力値の指数部e「+16」に対応するバッファ領域1072が追加される。
【0067】
そして、加減演算部105は、追加したバッファ領域1072に演算結果A1´(0.000000000000001E+16)を書き込む(ステップST117)。
【0068】
一方、ステップST115の判定において、繰り上げ後又は繰り下げ後の指数部eに対応するバッファ領域が用意されていると判定した場合(ステップST115:YES)、選択部104は、繰り上げ後又は繰り下げ後の指数部eに対応するバッファを選択する(ステップST118)。
次いで、加減演算部105は、選択部104により選択されたバッファ領域1073から、格納されているバッファの値を読み出す(ステップST119)。
そして、加減演算部105は、読み出したバッファの値と、繰り上げ後又は繰り下げ後の演算結果とに基づき加減演算をする(ステップST120)。
演算部100は、ステップST111に戻って、ステップST120において算出された演算結果について、有効桁数がバッファの有効桁数を超えるか否かの判定を行う。
【0069】
加減演算部105は、複数の入力値に基づいて上述の処理を繰り返し、全ての入力値についての加減演算が終了したか否かを判定する(ステップST121)。
全ての入力値についての加減演算が終了したと判定した場合(ステップST121:YES)、加減演算部105は、出力決定部106に対して、加減演算の処理の終了を通知する。これによい、出力決定部106は、バッファ部107に記憶されている情報に基づき、出力値を決定し、全体処理部12に出力する(ステップST122)。
そして、出力決定部106は、バッファ部107の全てのデータを消去する(ステップST123)。
【0070】
(実施例1)
次に、
図11を参照して、演算部100による実施例1について説明する。
図11は、演算部100による実施例1について説明するための参照図である。実施例1では、何らの入力値もない状態において、数値データD11〜D15が、この順番に入力値取得部102により取得された例について説明する。
はじめに、入力値取得部102が、入力値として、例えば数値データD11(1.23456789012345E+00)を取得する。バッファ管理部103は、数値データD11の指数部e「+00」に基づき、設定指数「+00」に対応するバッファ領域として、バッファ領域1073を追加する。選択部104は、バッファテーブル108を参照して、バッファ管理部103により追加された設定指数「+00」のバッファ領域1073を選択し、選択結果を加減演算部105に出力する。そして、加減演算部105は、選択部104により選択されたバッファ領域1073に数値データD11の仮数部f(1.234567890123450)を書き込む。
【0071】
次いで、入力値取得部102が、入力値として、例えば数値データD12(1.23456789012345E-16)を取得する。バッファ管理部103は、数値データD12の指数部e「−16」に基づき、設定指数「−16」に対応するバッファ領域として、バッファ領域1074を追加する。選択部104は、バッファテーブル108を参照して、バッファ管理部103により追加された設定指数「−16」のバッファ領域1074を選択し、選択結果を加減演算部105に出力する。そして、加減演算部105は、選択部104により選択されたバッファ領域1074に数値データD12の仮数部f(1.234567890123450)を書き込む。
【0072】
さらに、入力値取得部102が、入力値として、例えば数値データD13(1.23456789012345E-32)を取得する。バッファ管理部103は、数値データD13の指数部e「−32」に基づき、設定指数「−32」に対応するバッファ領域として、バッファ領域1075を追加する。選択部104は、バッファテーブル108を参照して、バッファ管理部103により追加された設定指数「−32」のバッファ領域1075を選択し、選択結果を加減演算部105に出力する。そして、加減演算部105は、選択部104により選択されたバッファ領域1075に数値データD13の仮数部f(1.234567890123450)を書き込む。
【0073】
次いで、入力値取得部102が、入力値として、例えば数値データD14(1.23456789012345E-16)を取得する。選択部104は、バッファテーブル108を参照して、指数部e「−16」に基づき、設定指数「−16」のバッファ領域1074を選択し、選択結果を加減演算部105に出力する。そして、加減演算部105は、選択部104により選択されたバッファ領域1074に格納されている値(1.234567890123450)と数値データD14の仮数部f(1.234567890123450)とを、数値データD14の符号部S(+)に応じて演算(つまり加算)した演算結果(2.469135780246900)を、バッファ領域1074に上書きする。
【0074】
さらに、入力値取得部102が、入力値として、例えば数値データD15(−1.23456789012345E+00)を取得する。選択部104は、バッファテーブル108を参照して、指数部e「+00」に基づき、設定指数「+00」のバッファ領域1073を選択し、選択結果を加減演算部105に出力する。そして、加減演算部105は、選択部104により選択されたバッファ領域1073に格納されている値(1.234567890123450)と数値データD15の仮数部f(1.234567890123450)とを、数値データD15の符号部S(−)に応じて演算(つまり減算)した演算結果(0.000000000000000)を、バッファ領域1073に上書きする。
【0075】
そして、出力決定部106は、バッファ領域1073〜1065に格納されている情報に基づき、出力値を決定する。実施形態において、出力決定部106は、バッファ領域1074に記憶されている情報に基づき、出力値(2.469135780246900E-16)を出力する。
【0076】
一方、本発明によらない場合、指数部e「−16」の値と指数部e「−32」の値は、指数部e「+00」の値よりも小さい値であるため、誤差として切り捨てられる場合がある。この場合、数値データD11〜D15を加減した結果は、(0.00000000000000E+00)となる。
実施例1に示す通り、演算部100は、それぞれ異なる設定指数に対応するバッファ領域毎に入力値の加減算結果を記憶しておき、最終的な演算結果を得ることができる。よって、演算部100は、誤差として削除され得る小さい値も、演算結果として得ることができる。
【0077】
(実施例2)
次に、
図12を参照して、演算部100による実施例2について説明する。
図12は、演算部100による実施例2について説明するための参照図である。実施例2では、何らの入力値もない状態において、数値データD21〜D23が、この順番に入力値取得部102により取得された例について説明する。
はじめに、入力値取得部102が、入力値として、例えば数値データD21(1.000000000000001E-16)を取得する。バッファ管理部103は、数値データD21の指数部e「−16」に基づき、設定指数「−16」に対応するバッファ領域として、バッファ領域1074を追加する。選択部104は、バッファテーブル108を参照して、バッファ管理部103により追加された設定指数「−16」のバッファ領域1074を選択し、選択結果を加減演算部105に出力する。そして、加減演算部105は、選択部104により選択されたバッファ領域1074に数値データD21の仮数部f(1.000000000000001)を書き込む。
【0078】
次いで、入力値取得部102が、入力値として、例えば数値データD22(9.000000000000002E-16)を取得する。選択部104は、バッファテーブル108を参照して、指数部e「−16」に基づき、設定指数「−16」のバッファ領域1074を選択し、選択結果を加減演算部105に出力する。そして、加減演算部105は、選択部104により選択されたバッファ領域1074に格納されている値(1.000000000000001)を読み出し、読み出した値と数値データD22の仮数部f(9.000000000000002)とを、数値データD22の符号部S(+)に応じて演算(つまり加算)した演算結果A20(10.000000000000003)を得る。
【0079】
ここで、演算結果A20(10.000000000000003)の有効桁数「17」は、バッファ領域1074の有効桁数「16」を超えている。よって、加減演算部105は、演算結果A20(10.000000000000003)がバッファの有効桁数の範囲内となるように変換する。実施形態において、加減演算部105は、演算結果A20(10.000000000000003)のうちバッファの有効桁数の範囲から外れる値を繰り上げることにより、演算結果A20(10.000000000000003)を、繰り上げ後の指数部e「+00」のデータである値A201(0.000000000000001E+00)と、繰り上げ前の指数部e「−16」のデータである値A202(0.000000000000003E-16)と、に分割する。
そして、加減演算部105は、演算結果A202(0.000000000000003E-16)の仮数部f(0.000000000000003)を、設定指数「−16」のバッファ領域1074に上書き。また、加減演算部105は、演算結果A201(0.000000000000001E+00)の仮数部f(0.000000000000001)を、設定指数「+00」のバッファ領域1073に書き込む。
【0080】
次いで、入力値取得部102が、入力値として、例えば数値データD23(−1.000000000000000E-15)を取得する。数値データD23(−1.000000000000000E-15)の指数部eは「−15」であるため、バッファ管理部103は、数値データD23の指数部eがバッファの設定指数の範囲内でないと判定する。この場合、バッファ管理部103は、数値データD23の指数部eがバッファの設定指数の範囲内となるように、数値データD23を変換する。実施形態において、バッファ管理部103は、数値データD23(−1.000000000000000E-15)の指数部eを「+00」とし、数値データD23(−0.000000000000001E+00)に変換する。
そして、選択部104は、バッファテーブル108を参照して、数値データD23の指数部e「+00」のバッファ領域1073を選択し、選択結果を加減演算部105に出力する。加減演算部105は、選択部104により選択されたバッファ領域1073に格納されている値(0.000000000000001)を読み出し、読み出した値と変換後の数値データD23の仮数部f(0.000000000000001)とを、数値データD23の符号部S(−)に応じた演算(例えば減算)した演算結果A21(0.000000000000000)を、バッファ領域1073に上書きする。
【0081】
そして、出力決定部106は、バッファ領域1073〜1064に格納されている情報に基づき、出力値を決定する。実施形態において、出力決定部106は、バッファ領域1074に記憶されている情報に基づき、出力値(3.00000000000000E-31)を出力する。
【0082】
一方、実施例2のように、バッファ領域の有効桁数を超えた場合に、上位の設定指数のバッファ領域への繰り上げを行わない場合、バッファ領域の有効桁数を超えた値の情報の一部がバッファ領域に記憶されない。図示の例では、設定指数「−16」のバッファ領域の情報の一部(0.000000000000003E-16)が切り捨てられてしまう場合がある。この場合、数値データD21〜D23を加減した結果は、(0.00000000000000E+00)となる。
実施例2に示す通り、演算部100は、設定指数に対応するバッファ領域毎に入力値の加減算結果を記憶しておき、バッファ領域毎の演算結果がバッファ領域の有効桁数を超えた場合、上位の設定指数のバッファ領域に繰り上げを行うことができる。よって、演算部100は、バッファ領域の有効桁数に対応できない値も、演算結果としてバッファ領域に格納することができる。従って、演算結果の精度をさらに高めることができる。
【0083】
(実施例3)
次に、
図13を参照して、演算部100による実施例3について説明する。
図13は、演算部100による実施例3について説明するための参照図である。実施例3では、何らの入力値もない状態において、数値データD31〜D23が、この順番に入力値取得部102により取得された例について説明する。
はじめに、入力値取得部102が、入力値として、例えば数値データD31(2.000000000000000)を取得する。バッファ管理部103は、バッファテーブル108を参照して、数値データD31を、バッファ領域に応じた指数で示す浮動小数点形式の値に変換する。つまり、バッファ管理部103は、数値データD31(2.000000000000000)を、数値データD31(2.000000000000000E+00)に変換する。バッファ管理部103は、数値データD31の指数部e「+00」に基づき、設定指数「+00」に対応するバッファ領域として、バッファ領域1073を追加する。選択部104は、バッファテーブル108を参照して、バッファ管理部103により追加された設定指数「+00」のバッファ領域1073を選択し、選択結果を加減演算部105に出力する。そして、加減演算部105は、選択部104により選択されたバッファ領域1073に数値データD31の仮数部f(2.000000000000000)を書き込む。
【0084】
次いで、入力値取得部102が、入力値として、例えば数値データD32(-0.999999999999999)を取得する。バッファ管理部103は、バッファテーブル108を参照して、数値データD32を、バッファ領域に応じた指数で示す浮動小数点形式の値に変換する。つまり、バッファ管理部103は、数値データD32(-0.999999999999999)を、数値データD32(-0.999999999999999E+00)に変換する。選択部104は、バッファテーブル108を参照して、指数部e「+00」に基づき、設定指数「+00」のバッファ領域1073を選択し、選択結果を加減演算部105に出力する。そして、加減演算部105は、選択部104により選択されたバッファ領域1073に格納されている値(2.000000000000000)を読み出し、読み出した値と数値データD32の仮数部f(0.999999999999999)とを、数値データD32の符号部S(−)に応じて演算(つまり減算)した演算結果A30(1.0000000000000001)を得る。
【0085】
ここで、演算結果A30(1.0000000000000001)の有効桁数「17」は、バッファ領域1073の有効桁数「16」を超えている。よって、加減演算部105は、演算結果A30(1.0000000000000001)がバッファの有効桁数の範囲内となるように変換する。実施形態において、加減演算部105は、演算結果A30(1.0000000000000001)のうちバッファの有効桁数の範囲から外れる値を繰り下げることにより、演算結果A30(1.0000000000000001)を、繰り下げ後の指数部e「−16」のデータである値A301(1.000000000000000E-16)と、繰り下げ前の指数部e「+00」のデータである値A302(1.000000000000000E+00)と、に分割する。
そして、加減演算部105は、演算結果A302(1.000000000000000E+00)の仮数部f(1.000000000000000)を、設定指数「+00」のバッファ領域1073に上書き。また、加減演算部105は、演算結果A301(1.000000000000000E-16)の仮数部f(1.000000000000000)を、設定指数「−16」のバッファ領域1074に書き込む。
【0086】
次いで、入力値取得部102が、入力値として、例えば数値データD33(−1.000000000000000)を取得する。バッファ管理部103は、バッファテーブル108を参照して、数値データD33を、バッファ領域に応じた指数で示す浮動小数点形式の値に変換する。つまり、バッファ管理部103は、数値データD33(−1.000000000000000)を、数値データD32(−1.000000000000000E+00)に変換する。選択部104は、バッファテーブル108を参照して、数値データD33の指数部e「+00」のバッファ領域1073を選択し、選択結果を加減演算部105に出力する。加減演算部105は、選択部104により選択されたバッファ領域1073に格納されている値(1.000000000000000)を読み出し、読み出した値と変換後の数値データD33の仮数部f(1.000000000000000)とを、数値データD33の符号部S(−)に応じた演算(例えば減算)した演算結果A31(0.000000000000000)を、バッファ領域1073に上書きする。
【0087】
そして、出力決定部106は、バッファ領域1073〜1064に格納されている情報に基づき、出力値を決定する。実施形態において、出力決定部106は、バッファ領域1074に記憶されている情報に基づき、出力値(1.000000000000000E-16)を出力する。
【0088】
一方、実施例3のように、バッファ領域の有効桁数を超えた場合に、下位の設定指数のバッファ領域への繰り下げを行わない場合、バッファ領域の有効桁数を超えた値の情報の一部がバッファ領域に記憶されない。図示の例では、設定指数「+00」のバッファ領域の情報の一部(0.000000000000001E+00)が切り捨てられてしまう場合がある。この場合、数値データD31〜D33を加減した結果は、(0.00000000000000E+00)となる。
実施例3に示す通り、演算部100は、設定指数に対応するバッファ領域毎に入力値の加減算結果を記憶しておき、バッファ領域毎の演算結果がバッファ領域の有効桁数を超えた場合、下位の設定指数のバッファ領域に繰り下げを行うことができる。よって、演算部100は、バッファ領域の有効桁数に対応できない値も、演算結果としてバッファ領域に格納することができる。従って、演算結果の精度をさらに高めることができる。
【0089】
(実施例4)
次に、
図14を参照して、演算部100による実施例4について説明する。
図14は、演算部100による実施例4について説明するための参照図である。実施例4では、何らの入力値もない状態において、数値データD41〜D43が、この順番に入力値取得部102により取得された例について説明する。
はじめに、入力値取得部102が、入力値として、例えば数値データD41(1.00000000000001E-16)を取得する。バッファ管理部103は、数値データD41の指数部e「−16」に基づき、設定指数「−16」に対応するバッファ領域として、バッファ領域1074を追加する。選択部104は、バッファテーブル108を参照して、バッファ管理部103により追加された設定指数「−16」のバッファ領域1074を選択し、選択結果を加減演算部105に出力する。そして、加減演算部105は、選択部104により選択されたバッファ領域1074に数値データD41の仮数部f(1.00000000000001)を書き込む。
【0090】
次いで、入力値取得部102が、入力値として、例えば数値データD42(2.00000000000002E-32)を取得する。バッファ管理部103は、バッファテーブル108を参照して、数値データD42の指数部e「−32」に対応するバッファ領域が用意されているか否かを判定する。指数部e「−32」に対応するバッファ領域が用意されていないと判定した場合、バッファ管理部103は、数値データD42の指数部e「−32」に対応するバッファ領域を追加する。これにより、選択部104は、バッファテーブル108を参照して、数値データD42の指数部e「−32」に基づき、設定指数「−32」のバッファ領域1075を選択し、選択結果を加減演算部105に出力する。そして、加減演算部105は、選択部104により選択されたバッファ領域1075に、数値データD42の仮数部f(2.00000000000002)を書き込む。
【0091】
一方、取得した入力値の指数部eに対応するバッファ領域を追加しない場合、バッファ領域に対応しない入力値は加減演算されないこととなる。図示の例では、指数部e「−32」の数値データD42が全て切り捨てられてしまう場合がある。この場合、数値データD41〜D43を加減した結果は、(0.00000000000000E+00)となる。
実施例4に示す通り、取得した入力値の指数部eに対応するバッファ領域が用意されていない場合、バッファ管理部103は、取得した入力値の指数部eに対応するバッファ領域を追加することができる。よって、演算部100は、誤差として削除され得る小さい値も、演算結果としてバッファ領域に格納することができる。従って、演算結果の精度をさらに高めることができる。
【0092】
(実施例5)
次に、
図15を参照して、演算部100による実施例5について説明する。
図15は、演算部100による実施例5について説明するための参照図である。実施例5では、何らの入力値もない状態において、数値データD11〜D15が、この順番に入力値取得部102により取得された例について説明する。詳細については、実施例1と同じであるため、説明を省略する。
図示に示す通り、数値データD11〜D13を加減演算した後、演算部100の処理が中断され、その後、再開されたとする。この場合、演算部100は、バッファ領域1073〜1065に記憶された情報を用いて、数値データD11〜D13の演算結果に対して、数値データD14〜D15を加減演算することができる。従って、演算処理が途中で中断し、再開された場合であっても、演算結果の精度を維持することができる。
【0093】
なお、実施形態において、バッファ領域1071〜1075のバッファサイズは固定である例について説明したが、これに限られない。例えば、バッファ管理部103は、バッファ部のメモリ残量に応じて、追加するバッファ領域1071〜1075のバッファサイズを変更してもよい。これにより、バッファ部107のメモリ残量が少ない場合、バッファ管理部103は、追加するバッファ領域1071〜1075のそれぞれのバッファサイズを小さくして、入力値の指数部eに応じた新たなバッファ領域を追加することが可能になる。
【0094】
また、実施形態において、加減演算部105は、加算と減算の両方の演算を一項する機能部として説明したが、これに限らない。例えば、加減演算部105は、加算、又は、減算の一方のみを実行する機能部であってもよい。
【0095】
なお、上述した実施形態における制御部101の一部、例えば、入力値取得部102と、バッファ管理部103と、選択部104と、加減演算部105と、出力決定部106と、をコンピュータで実現するようにしても良い。その場合、この制御機能を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することによって実現しても良い。なお、ここでいう「コンピュータシステム」とは、演算部100に内蔵されたコンピュータシステムであって、OSや周辺機器等のハードウェアを含むものとする。また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ROM、CD−ROM等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムを送信する場合の通信線のように、短時間、動的にプログラムを保持するもの、その場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリのように、一定時間プログラムを保持しているものも含んでも良い。また上記プログラムは、前述した機能の一部を実現するためのものであっても良く、さらに前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるものであっても良い。
【0096】
また、上述した実施形態における制御部101の一部、または全部を、LSI(Large Scale Integration)等の集積回路として実現しても良い。制御部101の各機能ブロックは個別にプロセッサ化してもよいし、一部、または全部を集積してプロセッサ化しても良い。また、集積回路化の手法はLSIに限らず専用回路、または汎用プロセッサで実現しても良い。また、半導体技術の進歩によりLSIに代替する集積回路化の技術が出現した場合、当該技術による集積回路を用いても良い。
【0097】
以上、本発明を実施するための形態について実施形態を用いて説明したが、本発明はこうした実施形態に何等限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々の変形及び置換を加えることができる。