説明

数値丸め方法,数値丸めプログラム,コンピュータおよびコンパイルプログラム

【課題】ハードウェアのアーキテクチャに依らずに,指定された丸めモードに従った丸めの結果を得ることが可能となる技術を提供する。
【解決手段】第2精度基数変換部11は,変換対象数値を,指定された第1の精度より高い第2の精度で基数変換する。第1精度基数変換部13は,第2の精度で基数変換した結果を,指定された第1の精度で丸める。誤差算出部15は,第1の精度で丸めた結果と,第2の精度で基数変換した結果との誤差を算出する。丸め方向判定部17は,誤差の符号から,第1の精度で丸めた結果における丸めの方向が指定された丸めモードに従った丸めの方向であるかを判定する。丸め結果補正部18は,第1の精度で丸めた結果における丸めの方向が指定された丸めモードに従った丸めの方向でない場合に,誤差の符号と第1の精度で丸めた結果の符号との関係から,第1の精度で丸めた結果を補正する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は,数値の丸めを行う数値丸め方法,数値丸めプログラム,言語処理装置およびコンパイルプログラムに関するものである。
【背景技術】
【0002】
コンピュータで数値演算を行う場合,数値に対して指定された精度で演算結果を丸める必要がある。計算機で扱われる数値の丸め方法としては,例えば,浮動小数点演算の標準規格であるIEEE754で,方向丸めや最近接丸めなどの丸めモードが定義されている。
【0003】
なお,数値丸めに関する技術として,計算器で演算結果を表示する際に,表示する演算結果の数値が丸められているかを,また表示する演算結果の数値が丸められている場合にその丸めの方向を,表示部に設けられたインディケータに表示する技術が知られている。また,符号,指数部,仮数部および誤差判定情報を含んだ入力データを受けて,精度付き浮動小数点演算を行い,誤差判定情報に誤差があるとしたときに所定のビットを精度情報として演算して出力データに加える技術が知られている。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開平5−189205号公報
【特許文献2】特開平2−165225号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
数値の丸め方法を制御する際には,浮動小数点レジスタで設定されている丸めモードを変更する。浮動小数点レジスタは,ハードウェアのアーキテクチャによって,構造が異なる。
【0006】
例えば,あるハードウェアAの浮動小数点レジスタでは,浮動小数点レジスタ内で丸めモードを指すビット位置が,64ビット中の33・34ビット目であるものとする。また,別のハードウェアBの浮動小数点レジスタでは,浮動小数点レジスタ内で丸めモードを指すビット位置が,32ビット中の18・19ビット目であるものとする。この場合,ハードウェアAとハードウェアBとで浮動小数点レジスタの構造が異なっているため,丸めモードを操作する処理を,ハードウェアAとハードウェアBとでは共通化することはできない。
【0007】
このように,丸めモードを操作するためには,ハードウェアに依存する処理が必要であり,丸めモードを操作する処理を異なるハードウェア間で流用することができない,という問題がある。
【0008】
また,すべてのハードウェアがすべての丸めモードをサポートしているわけではない。そのため,ハードウェアで対応していない丸めモードを実装することができない,という問題がある。
【0009】
一側面では,本発明は,ハードウェアに設定された丸めモードとは異なる丸めモードに従った丸め結果を得ることが可能となる技術を提供することを目的とする。
【課題を解決するための手段】
【0010】
1態様では,数値丸め方法は,所定の丸めモードで基数変換を行うコンピュータが,第1の基数を用いて表される第1の数値を第2の基数を用いて第1の精度で表した第2の数値について,第1の数値を第2の基数を用いて第1の精度よりも高い第2の精度で表した第3の数値を基準とした誤差を算出し,誤差の正負が,指定された丸めモードに基づいて第1の数値に適用される丸めの方向の正負と一致しない場合に,第2の数値に対して,丸めの方向に第2の精度に対応する丸め幅の補正を行う。
【発明の効果】
【0011】
1態様では,ハードウェアに設定された丸めモードとは異なる丸めモードに従った丸め結果を得ることが可能となる。
【図面の簡単な説明】
【0012】
【図1】本実施の形態による数値丸め部の構成例を示す図である。
【図2】本実施の形態による丸め結果の符号と誤差の符号との組合せに対応する丸め結果の補正処理を示す図である。
【図3】本実施の形態による数値丸め部が組み込まれた言語処理装置の構成例を示す図である。
【図4】本実施の形態による数値丸め部や言語処理装置を実現するハードウェアの構成例を示す図である。
【図5】本実施の形態によるソースプログラムの例を示す図である。
【図6】本実施の形態の実行形式プログラムに含まれる入力処理の例を示すフローチャートである。
【図7】本実施の形態の入力データ解析処理部による変換対象数値解析処理フローチャートである。
【図8】本実施の形態の第2精度基数変換部による第2精度基数変換処理フローチャートである。
【図9】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモード対応処理フローチャートである。
【図10】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードUP処理フローチャートである。
【図11】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードDOWN処理フローチャートである。
【図12】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードZERO処理フローチャートである。
【図13】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードNEAREST処理フローチャートである。
【図14】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードCOMPATIBLE処理フローチャートである。
【発明を実施するための形態】
【0013】
以下,本実施の形態について,図を用いて説明する。
【0014】
変換対象数値に対する基数変換を行う際に,指定された精度で基数変換の結果を丸める必要がある。例えば,10進数で表される変換対象数値を2進数の値に基数変換する際に,基数変換の結果を4バイトの浮動小数点数で表すように指定されていれば,4バイトの浮動小数点数で表しきれない部分について,丸め処理が行われる。
【0015】
コンピュータで浮動小数点数の丸め処理を行う方法としては,例えば,浮動小数点演算の標準規格であるIEEE754で丸めモードが定義されている。浮動小数点数の丸めモードには,特定の方向の値に丸める方向丸めや,最近の値に丸める最近接丸めなどがある。
【0016】
浮動小数点数の演算は,演算速度が遅いため,ハードウェアで演算を行う場合が多い。このとき,演算結果を特定の丸めモードを指定して丸める場合には,浮動小数点レジスタで設定されている丸めモードを変更して演算を行う必要がある。
【0017】
しかし,浮動小数点レジスタは,ハードウェアのアーキテクチャによって構造が異なるため,丸めモードを操作する処理を,アーキテクチャが異なるハードウェア間で流用することができないという問題がある。また,すべてのハードウェアがすべての丸めモードをサポートしているわけではなく,ハードウェアがサポートしていない丸めモードに対応することはできないという問題もある。
【0018】
また,浮動小数点レジスタで設定されている丸めモードを変更する場合,同一スレッドで行われる別の処理に対しても影響を及ぼすという問題がある。複数のファイルに対して読み書きを行うプログラムの場合,ファイル単位に丸めモードを指定してそれぞれのファイルへの読み書きが繰り返されると,丸めモードを変更するレジスタの読み書きが頻繁に発生するため,性能低下が懸念される。
【0019】
以下では,基数変換で生じる誤差の丸めについて,ハードウェアに依存することなく,指定された丸めモードに従った丸め結果を得ることが可能となる,本実施の形態の技術について説明する。
【0020】
本実施の形態の技術は,所定の丸めモードで基数変換を行うコンピュータが,第1の基数を用いて表される第1の数値を第2の基数を用いて第1の精度で表した第2の数値について,第1の数値を第2の基数を用いて第1の精度よりも高い第2の精度で表した第3の数値を基準とした誤差を算出し,誤差の正負が,指定された丸めモードに基づいて第1の数値に適用される丸めの方向の正負と一致しない場合に,第2の数値に対して,該丸めの方向に第2の精度に対応する丸め幅の補正を行う数値丸めに関する技術である。ここで,丸めモードは,所定の数値範囲毎に丸めの方向を定めたルールである。
【0021】
例えば,第1の基数が10進数であり,第1の数値がAであれば,第1の基数を用いて表される第1の数値は,10進数で表された数値Aである。
【0022】
さらに,例えば,第2の基数が2進数であり,第1の精度が4バイトの浮動小数点数の精度であり,第2の数値がBであれば,第2の基数を用いて第1の精度で表した第2の数値は,2進数の4バイトの浮動小数点数で表された数値Bである。上記によると,数値Bは,数値Aを10進数から2進数に基数変換し,結果を4バイトの浮動小数点数に丸めた値となる。
【0023】
さらに,例えば,第2の精度が8バイトの浮動小数点数の精度であり,第3の数値がCであれば,第2の基数を用いて第2の精度で表した第3の数値は,2進数の8バイトの浮動小数点数で表された数値Cである。上記によると,数値Cは,数値Aを10進数から2進数に基数変換し,結果を8バイトの浮動小数点数に丸めた値となる。
【0024】
このとき,例えば,上記の誤差は,B−Cとなる。この誤差の正負が,実際にコンピュータが基数変換で行った丸めの方向である。ここで,誤差B−Cの正負が,指定された丸めモードに基づいて第1の数値Aに適用される丸めの方向の正負と一致しない場合に,第2の数値Bに対して,該丸めの方向に第2の精度に対応する丸め幅の補正が行われる。
【0025】
以下では,このような本実施の形態の技術の例について説明する。
【0026】
図1は,本実施の形態による数値丸め部の構成例を示す図である。
【0027】
数値丸め部10は,数値の基数変換時において,指定された丸めモードに応じた数値の丸めを行う。例えば,数値丸め部10は,基数変換の対象となる数値の情報を入力し,指定された丸めモードで丸めが行われた基数変換の結果を出力する。
【0028】
数値丸め部10は,第2精度基数変換部11,第2精度結果記憶部12,第1精度基数変換部13,第1精度結果記憶部14,誤差算出部15,誤差記憶部16,丸め方向判定部17,丸め結果補正部18を備える。
【0029】
第2精度基数変換部11は,変換対象数値を,指定された第1の精度より高い第2の精度で基数変換する。第2精度基数変換部11は,得られた第2の精度で基数変換した結果を,第2精度結果記憶部12に記憶する。第2精度結果記憶部12は,第2の精度で基数変換した結果を記憶する,コンピュータがアクセス可能なメモリ等の記憶部である。
【0030】
第1精度基数変換部13は,第2の精度で基数変換した結果を第1の精度で丸める。第1精度基数変換部13は,第2の精度で基数変換した結果を第1の精度で丸める処理を,ハードウェア処理で行う。このとき,第1精度基数変換部13は,浮動小数点レジスタの丸めモードの設定変更を行わない。
【0031】
第2の精度で基数変換した結果を第1の精度で丸めた結果は,変換対象数値を,指定された第1の精度で基数変換した結果を示す。第1精度基数変換部13は,得られた第1の精度で丸めた結果を,第1精度結果記憶部14に記憶する。第1精度結果記憶部14は,第1の精度で丸めた結果を記憶する,コンピュータがアクセス可能なメモリ等の記憶部である。
【0032】
例えば,10進数で表される変換対象数値を,2進数の浮動小数点数に基数変換するものとする。また,基数変換の結果は,4バイトの実数で表すように指定されているものとする。指定された4バイトの実数の精度が,指定された第1の精度となる。このとき,第2精度基数変換部11は,例えば,基数変換の結果が指定された4バイトの実数より精度が高い8バイトの実数で表されるように,基数変換を行う。指定された4バイトの実数より精度が高い8バイトの実数の精度が,第2の精度となる。第1精度基数変換部13は,8バイトの実数で表される基数変換の結果を,4バイトの実数に丸める。
【0033】
誤差算出部15は,第2の精度で基数変換した結果を第1の精度で丸めた結果と,第2の精度で基数変換した結果との誤差を算出する。算出された誤差は,第2の精度で基数変換した結果を第1の精度で丸めたときの丸め誤差となる。誤差算出部15は,得られた誤差を,誤差記憶部16に記憶する。誤差記憶部16は,第2の精度で基数変換した結果を第1の精度で丸めたときの誤差を記憶する,コンピュータがアクセス可能なメモリ等の記憶部である。
【0034】
例えば,上記の例において,誤差算出部15は,8バイトの実数で表される基数変換の結果を4バイトの実数に丸めた結果から,8バイトの実数で表される基数変換の結果を差し引き,誤差を算出する。
【0035】
丸め方向判定部17は,誤差の符号から判断される第1の精度で丸めた結果における丸めの方向が,指定された丸めモードに従った丸めの方向に一致するかを判定する。
【0036】
丸めが行われたときの結果は,正の方向に丸められた値か,負の方向に丸められた値かの2パターンに収束する。第2の精度で基数変換した結果は,第1の精度で丸めた結果よりも元の変換対象数値に近い値であるので,算出された誤差の符号は,第1の精度で丸めた結果における丸めの方向を表している。
【0037】
例えば,誤差が,第1の精度で丸めた結果から第2の精度で基数変換した結果を差し引いて得られるものとする。このとき,誤差の符号が正であれば,第1の精度で丸めた結果における丸めの方向は,正の方向であり,誤差の符号が負であれば,第1の精度で丸めた結果における丸めの方向は,負の方向である。なお,誤差が第2の精度で基数変換した結果から第1の精度で丸めた結果を差し引いて得られる場合には,誤差の符号と第1の精度で丸めた結果における丸めの方向との関係は,逆の関係となる。
【0038】
上述したように,本実施の形態による第1精度基数変換部13は,第2の精度で基数変換した結果を第1の精度で丸める処理を,ハードウェアの丸めモードの設定変更を行わずに実行する。すなわち,第1の精度で丸めた結果における丸めの方向は,第2の精度で基数変換した結果が第1の精度で丸められたときに,実際にハードウェアで丸められた方向が正の方向であったのか負の方向であったのかを示している。これに対して,指定された丸めモードに従った丸めの方向は,第2の精度で基数変換した結果を第1の精度で丸める処理を,指定された丸めモードに従って行った場合の丸めの方向を示す。
【0039】
第1の精度で丸めた結果における丸めの方向が指定された丸めモードに従った丸めの方向に一致するか否かは,誤差の符号や第1の精度で丸めた結果の符号などに基づいた,丸めモードに応じたアルゴリズムを用いて判定することができる。
【0040】
丸め結果補正部18は,第1の精度で丸めた結果における丸めの方向が,指定された丸めモードに従った丸めの方向に一致しない場合に,誤差の符号と第1の精度で丸めた結果の符号との関係から,第1の精度で丸めた結果を補正する。補正は,第1の精度で丸めた結果が指定された丸めモードに応じた値となるように,第1の精度で丸めた結果における丸めの方向を反対方向に変更した丸め結果に,第1の精度で丸めた結果を更新することを意味する。
【0041】
第1の精度で丸めた結果における丸めの方向が分かれば,その反対方向に丸めが行われた場合の丸め結果も,第1の精度で丸めた結果の浮動小数点数をインクリメントまたはデクリメントすることで,容易に得ることができる。ただし,2進数の浮動小数点数で表される値をインクリメントまたはデクリメントした補正の結果は,その値の符号の正負によって,正の方向への補正であるか負の方向への補正であるかが異なる。丸め結果補正部18は,誤差の符号と第1の精度で丸めた結果の符号との関係に応じて,第1の精度で丸めた結果をインクリメントまたはデクリメントする補正を行う。
【0042】
図2は,本実施の形態による丸め結果の符号と誤差の符号との組合せに対応する丸め結果の補正処理を示す図である。
【0043】
図2において,丸め結果の符号は,第1の精度で丸めた結果の符号を示す。誤差の符号は,第1の精度で丸めた結果から第2の精度で基数変換した結果を差し引いて算出された誤差の符号を示す。処理は,第1の精度で丸めた結果に対する補正処理を示す。
【0044】
例えば,第1の精度で丸めた結果から第2の精度で基数変換した結果を差し引いて誤差が算出される場合に,算出された誤差の符号が正であれば,第1の精度で丸めた結果における丸めの方向は正の方向である。それが指定された丸めモードに従った丸めの方向に一致しなかった場合,丸め結果補正部18は,第1の精度で丸めた結果を,反対の負の方向に丸めた結果に更新する補正を行う。
【0045】
このとき,丸め結果補正部18は,図2に示すように,第1の精度で丸めた結果の符号が正であれば,第1の精度で丸めた結果をデクリメントし,第1の精度で丸めた結果の符号が負であれば,第1の精度で丸めた結果をインクリメントする補正を行う。
【0046】
また,例えば,第1の精度で丸めた結果から第2の精度で基数変換した結果を差し引いて誤差が算出される場合に,算出された誤差の符号が負であれば,第1の精度で丸めた結果における丸めの方向は負の方向である。それが指定された丸めモードに従った丸めの方向に一致しなかった場合,丸め結果補正部18は,第1の精度で丸めた結果を,反対の正の方向に丸めた結果に更新する補正を行う。
【0047】
このとき,丸め結果補正部18は,図2に示すように,第1の精度で丸めた結果の符号が正であれば,第1の精度で丸めた結果をインクリメントし,第1の精度で丸めた結果の符号が負であれば,第1の精度で丸めた結果をデクリメントする補正を行う。
【0048】
ここで,丸めモードに応じた,本実施の形態の丸め方向判定部17と丸め結果補正部18による処理の例を説明する。
【0049】
上述したように,浮動小数点数の丸めモードには,特定の方向の値に丸める方向丸めや,最近の値に丸める最近接丸めなどがある。以下では,方向丸めとして“UP”,“DOWN”,“ZERO”の3つの丸めモードが,最近接丸めとして“NEAREST”,“COMPATIBLE”の2つの丸めモードがあるものとして,説明を行う。
【0050】
なお,以下の説明において,誤差は,丸めた結果から丸める前の元の値を差し引いて算出される値であるものとする。例えば,本実施の形態の例では,誤差は,第1の精度で丸めた結果から第2の精度で基数変換した結果を差し引いて算出される値となる。誤差が第2の精度で基数変換した結果から第1の精度で丸めた結果を差し引いて算出された値である場合には,以下の説明における誤差の符号の取り扱いを逆にする必要がある。
【0051】
まず,指定された丸めモードが方向丸めである場合の例について説明する。
【0052】
指定された丸めモードが方向丸めである場合には,丸め方向判定部17は,第1の精度で丸めた結果の符号や誤差について,指定された丸めモードの定義に一致するかを判定する。第1の精度で丸めた結果の符号や誤差について,指定された丸めモードの定義に一致しない場合には,丸め方向判定部17は,第1の精度で丸めた結果における丸めの方向が,指定された丸めモードに従った丸めの方向に一致しないと判定する。このとき,丸め結果補正部18は,誤差の符号と第1の精度で丸めた結果の符号との関係から,第1の精度で丸めた結果を,第1の精度で丸めた結果における丸めの方向を反対方向に変更した丸め結果に更新する補正を行う。
【0053】
本実施の形態において,“UP”は,正の無限大方向に丸めを行う丸めモードを示す。“UP”で丸めが行われた場合には,誤差は,必ず0以上になる。すなわち,誤差の符号が負である場合には,丸めた結果は,“UP”で丸めが行われた結果ではない。
【0054】
例えば,指定された丸めモードが“UP”である場合に,算出された誤差の符号が負であれば,丸め方向判定部17は,第1の精度で丸めた結果における丸めの方向が,指定された丸めモード“UP”に従った丸めの方向に一致しないと判定する。このとき,丸め結果補正部18は,図2に示すように,第1の精度で丸めた結果の符号が正であれば,第1の精度で丸めた結果をインクリメントする補正を行い,第1の精度で丸めた結果の符号が負であれば,第1の精度で丸めた結果をデクリメントする補正を行う。
【0055】
本実施の形態において,“DOWN”は,負の無限大方向に丸めを行う丸めモードを示す。“DOWN”で丸めが行われた場合には,誤差は,必ず0以下になる。すなわち,誤差の符号が正である場合には,丸めた結果は,“DOWN”で丸めが行われた結果ではない。
【0056】
例えば,指定された丸めモードが“DOWN”である場合に,算出された誤差の符号が正であれば,丸め方向判定部17は,第1の精度で丸めた結果における丸めの方向が,指定された丸めモード“DOWN”に従った丸めの方向に一致しないと判定する。このとき,丸め結果補正部18は,図2に示すように,第1の精度で丸めた結果の符号が正であれば,第1の精度で丸めた結果をデクリメントする補正を行い,第1の精度で丸めた結果の符号が負であれば,第1の精度で丸めた結果をインクリメントする補正を行う。
【0057】
本実施の形態において,“ZERO”は,0に近づく方向に丸めを行う丸めモードを示す。“ZERO”で丸めが行われた場合には,誤差は,丸めた結果と符号が異なる値になるか,0になる。すなわち,誤差の符号と丸めた結果の符号とが一致する場合には,丸めた結果は,“ZERO”で丸めが行われた結果ではない。
【0058】
例えば,指定された丸めモードが“ZERO”である場合に,算出された誤差の符号と第1の精度で丸めた結果の符号とが一致すれば,丸め方向判定部17は,第1の精度で丸めた結果における丸めの方向が,指定された丸めモード“ZERO”に従った丸めの方向に一致しないと判定する。このとき,丸め結果補正部18は,図2に示すように,第1の精度で丸めた結果をデクリメントする補正を行う。
【0059】
次に,指定された丸めモードが最近接丸めである場合の例について説明する。
【0060】
最近接丸めにおいて,“NEAREST”と“COMPATIBLE”は,いずれも,表現できる最も近くの値に丸めを行う丸めモードを示す。すなわち,“NEAREST”と“COMPATIBLE”は,いずれも誤差が小さくなる方向への丸めを行う丸めモードである。
【0061】
ただし,“NEAREST”と“COMPATIBLE”では,丸める前の元の値が丸め結果として表現可能な2つの値の中間値であった場合の処理が異なる。すなわち,“NEAREST”と“COMPATIBLE”では,丸める前の元の値と丸め結果として表現可能な2つの値との間の誤差の絶対値が同じになる場合の処理が異なる。
【0062】
“NEAREST”では,丸める前の元の値が丸め結果として表現可能な2つの値の中間値である場合に,丸め結果が偶数となる方向への丸めが行われる。すなわち,丸め結果が浮動小数点数で表現される場合には,丸め結果の最下位ビットが0になるように丸め処理が行われる。
【0063】
これに対して,“COMPATIBLE”では,丸める前の元の値が丸め結果として表現可能な2つの値の中間値である場合に,0から離れる方向への丸めが行われる。
【0064】
“NEAREST”と“COMPATIBLE”との違いを,具体例で説明する。ここでは,分かりやすく説明するために,10進数の例を用いて説明を行う。
【0065】
例えば,10進数の値「2.2」を整数に丸める例を考える。丸め結果として表現可能な2つの値は,「2」または「3」である。2つの値のうち,元の値「2.2」との誤差が小さくなるのは「2」であるので,丸めモードが“NEAREST”である場合でも,“COMPATIBLE”である場合でも,ともに丸め結果は「2」となる。
【0066】
また,例えば,10進数の値「2.5」を整数に丸める例を考える。丸め結果として表現可能な2つの値は,「2」または「3」である。元の値「2.5」と2つの値との誤差は,ともに等しい「0.5」となる。このとき,丸めモードが“NEAREST”である場合には,丸め結果が偶数になるように値の丸めが行われる。丸めモードが“NEAREST”である場合の丸め結果は,「2」となる。これに対して,丸めモードが“COMPATIBLE”である場合には,丸め結果が「0」から遠くなるように値の丸めが行われる。丸めモードが“COMPATIBLE”である場合の丸め結果は,「3」となる。
【0067】
指定された丸めモードが最近接丸めである場合には,丸め方向判定部17は,第1の精度で丸めた結果における丸めの方向を反対方向に変更した,もう1つのパターンの丸め結果を求める。ここでは,第1の精度で丸めた結果における丸めの方向を反対方向に変更した,もう1つのパターンの丸め結果を,反対方向丸め結果と呼ぶ。丸め方向判定部17は,図2に示すように,第1の精度で丸めた結果の符号と誤差の符号との関係に基づいて,第1の精度で丸めた結果の浮動小数点数をインクリメントまたはデクリメントすることで,反対方向丸め結果を得ることができる。
【0068】
丸め方向判定部17は,反対方向丸め結果と第2の精度で基数変換した結果との誤差を求める。丸め方向判定部17は,第1の精度で丸めた結果と第2の精度で基数変換した結果との誤差の絶対値と,反対方向丸め結果と第2の精度で基数変換した結果との誤差の絶対値とを比較する。丸め方向判定部17は,誤差の絶対値が小さい方の丸め結果における丸めの方向を,指定された丸めモードに従った丸めの方向と判断する。
【0069】
なお,双方の誤差の絶対値が一致する場合には,丸め方向判定部17は,指定された丸めモードに応じた判断を行う。例えば,指定された丸めモードが“NEAREST”である場合には,丸め方向判定部17は,浮動小数点数の最終ビットが0である丸め結果における丸めの方向を,指定された丸めモードに従った丸めの方向と判断する。また,指定された丸めモードが“COMPATIBLE”である場合には,丸め方向判定部17は,浮動小数点数の仮数部の値が大きい方の丸め結果における丸めの方向を,指定された丸めモードに従った丸めの方向と判断する。
【0070】
丸め方向判定部17は,反対方向丸め結果における丸めの方向を指定された丸めモードに従った丸めの方向と判断した場合に,第1の精度で丸めた結果における丸めの方向が,指定された丸めモードに従った丸めの方向に一致しないと判定する。このとき,丸め結果補正部18は,反対方向丸め結果で第1の精度で丸めた結果を更新する補正を行う。丸め方向判定部17で算出された反対方向丸め結果は,誤差の符号と第1の精度で丸めた結果の符号との関係から,第1の精度で丸めた結果における丸めの方向を反対方向に変更した丸め結果である。
【0071】
ここで説明した丸めモードは一例であるので,図1に示す数値丸め部10は,必ずしもこれらの丸めモードのすべてに対応していなくてもよく,いずれか複数に対応できるものであればよい。また,図1に示す数値丸め部10が,ここで説明した丸めモード以外の丸めモードに対応していてもよい。
【0072】
このように,図1に示す数値丸め部10によって,ハードウェアのアーキテクチャに依らずに,指定された丸めモードに従った丸め結果を得ることができる。
【0073】
図3は,本実施の形態による数値丸め部が組み込まれた言語処理装置の構成例を示す図である。
【0074】
図3に示す言語処理装置20は,図1に示す数値丸め部10が組み込まれた装置の一例である。言語処理装置20は,プログラミング言語で記述されたソースプログラム40を翻訳し,コンピュータで実行可能な実行形式プログラム42を生成する。言語処理装置20は,コンパイル部21,リンカ部24,ライブラリ記憶部30を備える。
【0075】
コンパイル部21は,プログラミング言語で記述されたソースプログラム40をコンパイルし,オブジェクトプログラム41を生成するコンパイラである。
【0076】
本実施の形態において,コンパイル部21は,丸めモードを指定する命令文を含むソースプログラム40を入力する。コンパイル部21は,入力したソースプログラムを解析することにより,ライブラリ記憶部30に格納されている,図1に示す数値丸め部10を実現するプログラムを含むライブラリプログラムを呼び出す命令が記述されたオブジェクトプログラム41を出力する。
【0077】
本実施の形態によるコンパイル部21は,丸めモード指定命令解析部22,ライブラリ呼出し命令生成部23を備える。丸めモード指定命令解析部22は,ソースプログラム40に含まれる丸めモードを指定する命令文を解析する。ライブラリ呼出し命令生成部23は,丸めモード指定命令解析部22が解析した結果に従って,ライブラリ記憶部30に格納されたライブラリプログラムを呼び出す命令を,オブジェクトプログラム41内に出力する。
【0078】
リンカ部24は,オブジェクトプログラム41と,ライブラリ記憶部30に格納された各種のライブラリプログラムとを結合し,実行形式プログラム42を生成するリンカである。実行形式プログラム42とライブラリプログラムとのリンクは,動的リンクであってもよいし,静的リンクであってもよい。
【0079】
ライブラリ記憶部30は,汎用性の高い複数のライブラリプログラムを再利用可能な形で記憶する,コンピュータがアクセス可能な記憶部である。本実施の形態によるライブラリ記憶部30には,図1に示す数値丸め部10を実現するプログラムを含むライブラリプログラムが格納されている。
【0080】
ライブラリ記憶部30は,ライブラリプログラムによる処理手段として,例えば,ファイルオープン処理部31,ファイル読み込み処理部32,入力データ解析処理部33,入力値設定処理部34などを備える。
【0081】
ファイルオープン処理部31は,ファイルのデータを読み込むための準備をするOPEN命令を処理する。ファイル読み込み処理部32は,ファイルのデータを読み込む処理を行う。入力データ解析処理部33は,ファイルから読み込まれたデータを解析する処理を行う。
【0082】
入力値設定処理部34は,ファイルから読み込まれたデータを,利用者が指定した丸めモード,すなわちソースプログラム40の命令文で記述された丸めモードに従って加工し,実行形式プログラム42に引き渡す処理を行う。本実施の形態による入力値設定処理部34は,図1に示す数値丸め部10を備え,その数値丸め部10による結果の値を,実行形式プログラム42に返却する。
【0083】
実行形式プログラム42が実行された際に,データの入力処理43では,ファイル読み込み処理部32,入力データ解析処理部33,入力値設定処理部34等を実現するライブラリプログラムが呼び出され,実行される。このとき,入力値設定処理部34を実現するプログラムに含まれる,数値丸め部10を実現するプログラムによる処理が行われる。
【0084】
図3に示す言語処理装置20や,言語処理装置20が備えるコンパイル部21を実現するプログラムによって,図1に示す数値丸め部10を実現するプログラムを含むライブラリプログラムを呼び出して実行する実行形式プログラム42が生成される。これにより,ハードウェアの設定を変更することなく,利用者に指定された丸めモードに従った丸め処理を実行することが可能な実行形式プログラム42の生成が可能となる。
【0085】
図4は,本実施の形態による数値丸め部や言語処理装置を実現するハードウェアの構成例を示す図である。
【0086】
図1に示す数値丸め部10や図3に示す言語処理装置20は,例えば,CPU(Central Processing Unit )2,主記憶となるメモリ3,記憶装置4,通信装置5,媒体読取・書込装置6,入力装置7,出力装置8等を備えるコンピュータ1によって実現される。記憶装置4は,例えばHDD(Hard Disk Drive )などである。媒体読取・書込装置6は,例えばCD−R(Compact Disc Recordable )ドライブやDVD−R(Digital Versatile Disc Recordable )ドライブなどである。入力装置7は,例えばキーボード・マウスなどである。出力装置8は,例えばディスプレイ等の表示装置などである。
【0087】
図1に示す数値丸め部10および数値丸め部10が備える各機能部や,図3に示す言語処理装置20および言語処理装置20が備える各機能部は,コンピュータ1が備えるCPU2,メモリ3等のハードウェアと,ソフトウェアプログラムとによって実現することが可能である。コンピュータ1が実行可能なプログラムは,記憶装置4に記憶され,その実行時にメモリ3に読み出され,CPU2により実行される。
【0088】
コンピュータ1は,可搬型記録媒体から直接プログラムを読み取り,そのプログラムに従った処理を実行することもできる。また,コンピュータ1は,サーバコンピュータからプログラムが転送されるごとに,逐次,受け取ったプログラムに従った処理を実行することもできる。さらに,このプログラムは,コンピュータ1で読み取り可能な記録媒体に記録しておくことができる。
【0089】
図5は,本実施の形態によるソースプログラムの例を示す図である。
【0090】
図5に示すソースプログラム40は,Fortranの文法規則に従って記述されたソースプログラム40の例である。図5に示すソースプログラム40には,丸めモードを指定する命令文が含まれている。
【0091】
図5に示すソースプログラム40において,命令文(a)は,4バイトの実数r1,r2を宣言する命令文である。実数r1,r2は,それぞれ入力値を格納するために使用される。
【0092】
命令文(b)は,“work1.data”というファイルを開き,装置番号1として識別可能な状態にすることを指示する命令文である。命令文(b)は,このファイルからデータを入出力する場合の丸め方法に,“UP”の丸めモードを適用することを指示している。また,命令文(c)は,“work2.data”というファイルを開き,装置番号2として識別可能な状態にすることを指示する命令文である。命令文(c)は,このファイルからデータを入出力する場合の丸め方法に,“DOWN”の丸めモードを適用することを指示している。
【0093】
命令文(d)は,装置番号1のファイルから数値を表す文字列のデータを読み込み,実数r1に保持することを指示している。また,命令文(e)は,装置番号2のファイルから数値を表す文字列のデータを読み込み,実数r2に保持することを指示している。
【0094】
図5に示すソースプログラム40を,図3に示す言語処理装置20のコンパイル部21が入力し,コンパイル処理を行うものとする。
【0095】
図5に示すソースプログラム40の命令文(b),(c)に対して,コンパイル部21は,ライブラリ呼出し命令生成部23によって,それぞれファイルオープン処理部31を呼び出す命令を生成する。このとき,命令文(b),(c)には,丸めモードが指定されているので,丸めモード指定命令解析部22によって解析した丸めモードの情報が,実行形式プログラム42の実行時にファイルオープン処理部31にパラメータとして通知される。ファイルオープン処理部31は,指定されたファイルに対するオープン処理を実行するとともに,指定された丸めモードの情報を記憶する。
【0096】
また,コンパイル部21は,命令文(d),(e)に対して,それぞれライブラリ呼出し命令生成部23によって,ファイル読み込み処理部32,入力データ解析処理部33,入力値設定処理部34を呼び出す命令を生成する。実行形式プログラム42の実行において,命令文(d),(e)に相当する入力処理43の実行時に,本実施の形態の数値丸め部10による処理が実行される。
【0097】
以下,図3に示す実行形式プログラム42に含まれるファイルからデータを入力する入力処理43のフローチャートを例として,本実施の形態の数値丸め部10による処理の流れの例を説明する。
【0098】
図6は,本実施の形態の実行形式プログラムに含まれる入力処理の例を示すフローチャートである。
【0099】
図6に示す実行形式プログラム42に含まれる入力処理43の例では,実行形式プログラム42から呼び出されたファイル読み込み処理部32,入力データ解析処理部33,入力値設定処理部34による処理が行われる。
【0100】
なお,ここでは,ファイルのデータは,10進数を文字列で表現したデータであるものとする。入力処理43では,変換対象数値である10進数のデータを2進数に変換する基数変換が行われる。
【0101】
入力処理43において,ファイル読み込み処理部32は,変換対象数値の取得,すなわち10進数を表す文字列データの読み込みを行う(ステップS10)。例えば,ファイルから入力される文字列データが,10進数を表す「123.456789」であるものとする。この文字列データでは,小数点を含めて1つ1つの数字が,例えば1バイトの文字コードで表されている。
【0102】
入力データ解析処理部33は,入力された変換対象数値である文字列データを解析する変換対象数値解析処理を実行する(ステップS11)。変換対象数値解析処理では,後の基数変換のための事前処理が行われる。変換対象数値解析処理の詳細については,後述する。
【0103】
入力値設定処理部34の数値丸め部10において,第2精度基数変換部11は,第2精度基数変換処理を実行する(ステップS12)。第2精度基数変換処理では,変換対象数値を,プログラムで指定された第1の精度より高い第2の精度で基数変換する処理が行われる。第2精度基数変換処理の詳細については,後述する。
【0104】
第1精度基数変換部13は,変換対象数値を第2の精度で基数変換した結果を,第1の精度で丸める(ステップS13)。以下では,変換対象数値を第2の精度で基数変換した結果を,Sとする。Sは,第2の精度で表された2進数の浮動小数点数である。また,第1の精度で丸めた結果を,Yとする。Yは,第2の精度よりも低い第1の精度で表された2進数の浮動小数点数である。例えばYが4バイトの浮動小数点数である場合に,例えばSは8バイトの浮動小数点数である。第2の精度で表されるSを,第1の精度で表されるYに丸める処理は,浮動小数点数の演算となるので,ハードウェアを用いた処理となる。第1精度基数変換部13は,ハードウェアに,Sをプログラムで指定された型の実数Yに丸める命令を行う。
【0105】
誤差算出部15は,第2の精度で基数変換した結果と,その第2の精度で基数変換した結果を第1の精度で丸めた結果との誤差を算出する(ステップS14)。以下では,誤差を,Dとする。ここでは,誤差Dを,Y−Sの演算で求めるものとする。
【0106】
丸め方向判定部17は,D=0であるかを判定する(ステップS15)。D=0である場合には(ステップS15のYES),第1の精度で丸めた結果Yの補正は行わない。D=0でない場合には(ステップS15のNO),丸め方向判定部17および丸め結果補正部18による丸めモード対応処理を実行する(ステップS16)。丸めモード対応処理では,指定された丸めモードに応じた,第1の精度で丸めた結果における丸めの方向が指定された丸めモードに従ったものであるかを判定する処理や,第1の精度で丸めた結果を補正する処理が行われる。丸めモード対応処理の詳細については,後述する。
【0107】
入力値設定処理部34は,補正も含めた最終的な第1の精度で丸めた結果を入力値として設定し(ステップS17),呼び出し元の実行形式プログラム42に返却する。
【0108】
図7は,本実施の形態の入力データ解析処理部による変換対象数値解析処理フローチャートである。
【0109】
図7に示す変換対象数値解析処理では,後の基数変換のために,入力されたデータを解析する事前処理が行われる。ここでは,図3に示す入力データ解析処理部33により変換対象数値解析処理が行われる例を示すが,図1に示す第2精度基数変換部11が変換対象数値解析処理を含めた処理を行うようにしてもよい。
【0110】
入力データ解析処理部33は,ファイルから読み込んだ文字列データについて,小数点の位置と,指数表現の指数値とを解析する(ステップS20)。指数表現では,仮数部と指数部との間に“e”や“E”などの記号を挟んで,例えば,2.0×105 を“2.0e5”などと表す。例えば,入力された文字列データが「123.456789」である場合に,入力データ解析処理部33は,解析によって,小数点が先頭から4文字目の位置にあり,指数表現の指数値がないという情報を得る。
【0111】
入力データ解析処理部33は,入力された文字列データから小数点と指数表現とを除外した文字列cを生成する(ステップS21)。入力データ解析処理部33は,生成された文字列cをメモリに保持する。
【0112】
また,入力データ解析処理部33は,小数点位置を補正する数値eを求める(ステップS22)。数値eは,次の式が成り立つ値となる。
【0113】
0.[文字列c]×10のe乗 = 入力された文字列データで表される数値
入力データ解析処理部33は,求めた数値eをメモリに保持する。
【0114】
例えば,入力された文字列データが「123.456789」である場合,文字列cは「123456789」となり,e=3となる。
【0115】
入力データ解析処理部33は,文字列cの桁数fを求める(ステップS23)。例えば,文字列cが「123456789」である場合,桁数f=9である。
【0116】
図8は,本実施の形態の第2精度基数変換部による第2精度基数変換処理フローチャートである。
【0117】
図8に示すフローチャートにおいて,第2精度基数変換部11は,変換対象数値の情報として,図7に示す変換対象数値解析処理により得られた文字列c,数値e,桁数fを用いて,10進数から2進数への基数変換を第2の精度で実行する。なお,図8に示すフローチャートにおいて,文字c[i](i=0,1,…)は,文字列cの文字を左から順に表した配列である。
【0118】
第2精度基数変換部11は,2進数の浮動小数点数であるSを0に初期化し,カウンタiを0に初期化する(ステップS30)。
【0119】
第2精度基数変換部11は,i<fであるかを判定する(ステップS31)。ここでは,文字列cにおけるすべての文字について処理が終了したかが判定されている。
【0120】
i<fであれば(ステップS31のYES),第2精度基数変換部11は,文字c[i]を数値xに変換する(ステップS32)。ここでは,文字コードで数字を表す文字c[i]を,2進整数の数値xに変換する。
【0121】
第2精度基数変換部11は,S×10+xの演算結果を新たなSとする(ステップS33)。Sの演算は浮動小数点数の演算となるので,ステップS33の処理は,ハードウェアを用いた処理となる。第2精度基数変換部11は,カウンタiをインクリメントし(ステップS34),ステップS31の処理に戻る。
【0122】
i<fでなければ(ステップS31のNO),第2精度基数変換部11は,Sに10の(e−f)乗を掛ける演算を行う(ステップS35)。ここでは,文字列cで表されるすべての桁の数値についての処理の終了後に,指数についての処理が行われている。Sの演算は浮動小数点数の演算となるので,ステップS35の処理は,ハードウェアを用いた処理となる。
【0123】
ステップS35の処理で得られたSが,変換対象数値を,指定された第1の精度より高い第2の精度で基数変換した結果となる。
【0124】
図9は,本実施の形態の丸め方向判定部および丸め結果補正部による丸めモード対応処理フローチャートである。
【0125】
図9に示すフローチャートは,プログラムで指定された丸めモードに応じて,第1の精度で丸めた結果における丸めの方向の判定や,第1の精度で丸めた結果の補正を行う処理のフローチャートである。ここでは,プログラムにより指定される丸めモードが,“UP”,“DOWN”,“ZERO”,“NEAREST”,“COMPATIBLE”のいずれかであるものとする。
【0126】
丸め方向判定部17は,指定された丸めモードを判定する(ステップS40)。
【0127】
指定された丸めモードが“UP”である場合には(ステップS40の“UP”),丸め方向判定部17および丸め結果補正部18による,丸めモードUP処理が実行される(ステップS41)。丸めモードUP処理の詳細については,後述する。
【0128】
指定された丸めモードが“DOWN”である場合には(ステップS40の“DOWN”),丸め方向判定部17および丸め結果補正部18による,丸めモードDOWN処理が実行される(ステップS42)。丸めモードDOWN処理の詳細については,後述する。
【0129】
指定された丸めモードが“ZERO”である場合には(ステップS40の“ZERO”),丸め方向判定部17および丸め結果補正部18による,丸めモードZERO処理が実行される(ステップS43)。丸めモードZERO処理の詳細については,後述する。
【0130】
指定された丸めモードが“NEAREST”である場合には(ステップS40の“NEAREST”),丸め方向判定部17および丸め結果補正部18による,丸めモードNEAREST処理が実行される(ステップS44)。丸めモードNEAREST処理の詳細については,後述する。
【0131】
指定された丸めモードが“COMPATIBLE”である場合には(ステップS40の“COMPATIBLE”),丸め方向判定部17および丸め結果補正部18による,丸めモードCOMPATIBLE処理が実行される(ステップS45)。丸めモードCOMPATIBLE処理の詳細については,後述する。
【0132】
図10は,本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードUP処理フローチャートである。
【0133】
図10に示すフローチャートにおいて,Dは,図6のステップS14の処理で算出された誤差である。Yは,図6のステップS13の処理で得られた第1の精度に丸めた結果である。なお,INC(Y)は,浮動小数点数のYをインクリメントした結果を表し,DEC(Y)は,浮動小数点数のYをデクリメントした結果を表す。
【0134】
丸め方向判定部17は,D<0であるかを判定する(ステップS50)。
【0135】
D<0でなければ(ステップS50のNO),Yにおける丸めの方向は,指定された丸めモード“UP”に従った方向である。このとき,数値丸め部10は,Yの補正を行わずに処理を終了する。
【0136】
D<0であれば(ステップS50のYES),Yにおける丸めの方向は,指定された丸めモード“UP”に従った方向の反対方向である。このとき,丸め結果補正部18は,Yを補正する。丸め結果補正部18は,Y>0であるかを判定する(ステップS51)。Y>0であれば(ステップS51のYES),丸め結果補正部18は,YをINC(Y)で更新する補正を行う(ステップS52)。Y>0でなければ(ステップS51のNO),丸め結果補正部18は,YをDEC(Y)で更新する補正を行う(ステップS53)。
【0137】
図11は,本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードDOWN処理フローチャートである。
【0138】
図11に示すフローチャートにおいて,Dは,図6のステップS14の処理で算出された誤差である。Yは,図6のステップS13の処理で得られた第1の精度に丸めた結果である。なお,INC(Y)は,浮動小数点数のYをインクリメントした結果を表し,DEC(Y)は,浮動小数点数のYをデクリメントした結果を表す。
【0139】
丸め方向判定部17は,D>0であるかを判定する(ステップS60)。
【0140】
D>0でなければ(ステップS60のNO),Yにおける丸めの方向は,指定された丸めモード“DOWN”に従った方向である。このとき,数値丸め部10は,Yの補正を行わずに処理を終了する。
【0141】
D>0であれば(ステップS60のYES),Yにおける丸めの方向は,指定された丸めモード“DOWN”に従った方向の反対方向である。このとき,丸め結果補正部18は,Yを補正する。丸め結果補正部18は,Y>0であるかを判定する(ステップS61)。Y>0であれば(ステップS61のYES),丸め結果補正部18は,YをDEC(Y)で更新する補正を行う(ステップS62)。Y>0でなければ(ステップS61のNO),丸め結果補正部18は,YをINC(Y)で更新する補正を行う(ステップS63)。
【0142】
図12は,本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードZERO処理フローチャートである。
【0143】
図12に示すフローチャートにおいて,Dは,図6のステップS14の処理で算出された誤差である。Yは,図6のステップS13の処理で得られた第1の精度に丸めた結果である。なお,DEC(Y)は,浮動小数点数のYをデクリメントした結果を表す。
【0144】
丸め方向判定部17は,D>0であるかを判定する(ステップS70)。
【0145】
D>0であれば(ステップS70のYES),丸め方向判定部17は,Y>0であるかを判定する(ステップS71)。Y>0でなければ(ステップS71のNO),Yにおける丸めの方向は,指定された丸めモード“ZERO”に従った方向である。このとき,数値丸め部10は,Yの補正を行わずに処理を終了する。Y>0であれば(ステップS71のYES),Yにおける丸めの方向は,指定された丸めモード“ZERO”に従った方向の反対方向である。このとき,丸め結果補正部18は,Yを補正する。丸め結果補正部18は,YをDEC(Y)で更新する補正を行う(ステップS72)。
【0146】
D>0でなければ(ステップS70のNO),丸め方向判定部17は,Y>0であるかを判定する(ステップS73)。Y>0であれば(ステップS73のYES),Yにおける丸めの方向は,指定された丸めモード“ZERO”に従った方向である。このとき,数値丸め部10は,Yの補正を行わずに処理を終了する。Y>0でなければ(ステップS73のNO),Yにおける丸めの方向は,指定された丸めモード“ZERO”に従った方向の反対方向である。このとき,丸め結果補正部18は,Yを補正する。丸め結果補正部18は,YをDEC(Y)で更新する補正を行う(ステップS74)。
【0147】
図13は,本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードNEAREST処理フローチャートである。
【0148】
図13に示すフローチャートにおいて,Dは,図6のステップS14の処理で算出された誤差である。Yは,図6のステップS13の処理で得られた第1の精度に丸めた結果である。Sは,図6のステップS12の処理で得られた第2の精度で基数変換された結果である。なお,INC(Y)は,浮動小数点数のYをインクリメントした結果を表し,DEC(Y)は,浮動小数点数のYをデクリメントした結果を表す。Y’は,Yにおける丸めの方向を反対方向に変更した,もう1つのパターンの丸め結果を表す。D’は,SからY’への丸め誤差を表す。
【0149】
丸め方向判定部17は,D>0であるかを判定する(ステップS80)。
【0150】
D>0であれば(ステップS80のYES),丸め方向判定部17は,Y>0であるかを判定する(ステップS81)。Y>0であれば(ステップS81のYES),丸め方向判定部17は,DEC(Y)の値をY’とする(ステップS82)。Y>0でなければ(ステップS81のNO),丸め方向判定部17は,INC(Y)の値をY’とする(ステップS83)。
【0151】
D>0でなければ(ステップS80のNO),丸め方向判定部17は,Y>0であるかを判定する(ステップS84)。Y>0であれば(ステップS84のYES),丸め方向判定部17は,INC(Y)の値をY’とする(ステップS85)。Y>0でなければ(ステップS84のNO),丸め方向判定部17は,DEC(Y)の値をY’とする(ステップS86)。
【0152】
ここまでの処理は,Yにおける丸めの方向を反対方向に変更した,もう1つのパターンの丸め結果Y’を求める処理である。
【0153】
丸め方向判定部17は,誤差D’を,Y’−Sの演算で求める(ステップS87)。丸め方向判定部17は,|D|=|D’|であるかを判定する(ステップS88)。
【0154】
|D|=|D’|でなければ(ステップS88のNO),丸め方向判定部17は,|D|<|D’|であるかを判定する(ステップS89)。|D|<|D’|であれば(ステップS89のYES),Yにおける丸めの方向は,指定された丸めモード“NEAREST”に従った方向である。このとき,数値丸め部10は,Yの補正を行わずに処理を終了する。|D|<|D’|でなければ(ステップS89のNO),Yにおける丸めの方向は,指定された丸めモード“NEAREST”に従った方向の反対方向である。このとき,丸め結果補正部18は,Yを補正する。丸め結果補正部18は,YをY’で更新する補正を行う(ステップS810)。
【0155】
|D|=|D’|であれば(ステップS88のYES),丸め方向判定部17は,Yの浮動小数点数の最下位ビットが0であるかを判定する(ステップS811)。Yの浮動小数点数の最下位ビットが0であれば(ステップS811のYES),Yにおける丸めの方向は,指定された丸めモード“NEAREST”に従った方向である。このとき,数値丸め部10は,Yの補正を行わずに処理を終了する。Yの浮動小数点数の最下位ビットが0でなければ(ステップS811のNO),Yにおける丸めの方向は,指定された丸めモード“NEAREST”に従った方向の反対方向である。このとき,丸め結果補正部18は,Yを補正する。丸め結果補正部18は,YをY’で更新する補正を行う(ステップS812)。
【0156】
図14は,本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードCOMPATIBLE処理フローチャートである。
【0157】
図14に示す丸めモードCOMPATIBLE処理におけるステップS90〜ステップS910の処理は,基本的に図13に示す丸めモードNEAREST処理におけるステップS80〜ステップS810の処理と同じである。ここでは,図14に示す丸めモードCOMPATIBLE処理におけるステップS90〜ステップS910の処理の説明を省略し,ステップS911,ステップS912の処理のみ説明する。
【0158】
|D|=|D’|であれば(ステップS98のYES),丸め方向判定部17は,|Y|>|Y’|であるかを判定する(ステップS911)。|Y|>|Y’|であれば(ステップS911のYES),Yにおける丸めの方向は,指定された丸めモード“COMPATIBLE”に従った方向である。このとき,数値丸め部10は,Yの補正を行わずに処理を終了する。|Y|>|Y’|でなければ(ステップS911のNO),Yにおける丸めの方向は,指定された丸めモード“COMPATIBLE”に従った方向の反対方向である。このとき,丸め結果補正部18は,Yを補正する。丸め結果補正部18は,YをY’で更新する補正を行う(ステップS912)。
【0159】
以下,本実施の形態の数値丸め部10による基数変換の具体的な例を示す。ここでは,ファイルから入力された10進値の「123.456789」を,2進値の変数rに保持する例を説明する。なお,変数rには,4バイトの浮動小数点数で表された2進値が保持されるものとする。
【0160】
数値丸め部10において,第2精度基数変換部11は,変換対象数値「123.456789」を,指定された4バイトの精度より高い8バイトの精度で基数変換した値Sを求める。8バイトの浮動小数点数であるSは,例えば,S=01000000 0101 ……というような数値となる。このSを,10進表記すると「123.4567890000…」と表されるような数値となる。このSは,有効桁数の範囲で,ほぼ入力された値に等しいとみなせる。
【0161】
第1精度基数変換部13は,ハードウェア命令により,8バイトの浮動小数点数であるSを,4バイトの浮動小数点数であるYに丸める。このとき,Yは,例えば,
Y=01000010 11110110 11101001 11100000
となる。このYの浮動小数点数において,左側から順に,1ビットが符号部であり,続く8ビットが指数部であり,残りの23ビットが仮数部である。参考のために,この2進値のYを10進表記すると,「123.456787」となる。
【0162】
誤差算出部15は,YとSとの誤差Dを算出する。誤差Dは,10進表記で,
D=−0.000002
となる。
【0163】
丸め方向判定部17,丸め結果補正部18は,指定された丸めモードに応じた処理を行う。
【0164】
<丸めモードが“UP”の場合>
丸めモードが“UP”の場合,例えば図10に示すフローチャートに従った処理が行われる。誤差Dの符号が負であるため,図10に示すフローチャートに従って,Yの補正が必要となる。Yの符号は正であるので,丸め結果補正部18は,図10に示すフローチャートに従って,浮動小数点数のYをインクリメントする補正を行う。補正で得られる
Y=01000010 11110110 11101001 11100001
が,基数変換において指定された丸めモード“UP”で丸めが行われた結果として,変数rに保持される。この2進値のYを10進表記すると,「123.456795」となる。
【0165】
<丸めモードが“DOWN”の場合>
丸めモードが“DOWN”の場合,例えば図11に示すフローチャートに従った処理が行われる。誤差Dの符号が負であるため,図11に示すフローチャートに従って,Yの補正は不要となる。第1精度基数変換部13で得られた
Y=01000010 11110110 11101001 11100000
が,基数変換において指定された丸めモード“DOWN”で丸めが行われた結果として,変数rに保持される。この2進値のYを10進表記すると,「123.456787」となる。
【0166】
<丸めモードが“ZERO”の場合>
丸めモードが“ZERO”の場合,例えば図12に示すフローチャートに従った処理が行われる。誤差Dの符号がYの符号と異なるため,図12に示すフローチャートに従って,Yの補正は不要となる。第1精度基数変換部13で得られた
Y=01000010 11110110 11101001 11100000
が,基数変換において指定された丸めモード“ZERO”で丸めが行われた結果として,変数rに保持される。この2進値のYを10進表記すると,「123.456787」となる。
【0167】
<丸めモードが“NEAREST”または“COMPATIBLE”の場合>
丸めモードが“NEAREST”の場合,例えば図13に示すフローチャートに従った処理が行われる。また,丸めモードが“COMPATIBLE”の場合,例えば図14に示すフローチャートに従った処理が行われる。
【0168】
丸めモードが“NEAREST”または“COMPATIBLE”の場合,丸め方向判定部17は,図13または図14のフローチャートに従って,まず,Yの丸めの方向と反対方向に丸めた結果Y’を求める。誤差Dの符号が負であり,Yの符号が正であるので,浮動小数点数のYをインクリメントし,
Y’=01000010 11110110 11101001 11100001
を得る。この2進値のY’を10進表記すると,「123.456795」となる。
【0169】
次に,丸め方向判定部17は,図13または図14のフローチャートに従って,Y’とSとの誤差D’を算出する。誤差D’は,10進表記で,
D=0.000006
となる。
【0170】
丸め方向判定部17は,図13または図14のフローチャートに従って,|D|と|D’|とを比較する。
【0171】
|D|= 0.000002 < |D′|= 0.000006
となるので,図13または図14のフローチャートに従って,Yの補正は不要となる。第1精度基数変換部13で得られた
Y=01000010 11110110 11101001 11100000
が,基数変換において指定された丸めモード“NEAREST”または“COMPATIBLE”で丸めが行われた結果として,変数rに保持される。この2進値のYを10進表記すると,「123.456787」となる。
【0172】
以上説明した本実施の形態の数値丸め部10によって,ハードウェアのアーキテクチャに依らずに,指定された丸めモードに従った丸めの結果を得ることが可能となる。例えば,浮動小数点レジスタの設定変更を行わなくても,指定された丸めモードに従った丸めの結果を得ることが可能となる。また,ハードウェアがサポートしていない丸めモードに従った丸めの結果を得ることも可能となる。
【0173】
また,本実施の形態の数値丸め部10では,浮動小数点レジスタで設定されている丸めモードを変更しないので,同一スレッドで行われる別の処理に対する影響がない。また,複数のファイルに対して読み書きを行うプログラムの場合に,ファイル単位に丸めモードを指定してそれぞれのファイルへの読み書きが繰り返されても,丸めモードを変更するレジスタの読み書きが発生しないので,性能低下しない。
【0174】
以上,本実施の形態について説明したが,本発明はその主旨の範囲において種々の変形が可能であることは当然である。
【0175】
例えば,本実施の形態では,丸めモードを指定する命令を含むソースプログラムとして,Fortranで記述されたソースプログラムの例について説明したが,本実施の形態の技術は,C言語やJava(商標)などの他の言語で記述されたソースプログラムにも適用可能である。
【符号の説明】
【0176】
10 数値丸め部
11 第2精度基数変換部
12 第2精度結果記憶部
13 第1精度基数変換部
14 第1精度結果記憶部
15 誤差算出部
16 誤差記憶部
17 丸め方向判定部
18 丸め結果補正部
20 言語処理装置
21 コンパイル部
22 丸めモード指定命令解析部
23 ライブラリ呼出し命令生成部
24 リンカ部
30 ライブラリ記憶部
31 ファイルオープン処理部
32 ファイル読み込み処理部
33 入力データ解析処理部
34 入力値設定処理部
40 ソースプログラム
41 オブジェクトプログラム
42 実行形式プログラム
43 入力処理

【特許請求の範囲】
【請求項1】
所定の丸めモードで基数変換を行うコンピュータが,
第1の基数を用いて表される第1の数値を第2の基数を用いて第1の精度で表した第2の数値について,前記第1の数値を前記第2の基数を用いて前記第1の精度よりも高い第2の精度で表した第3の数値を基準とした誤差を算出し,
前記誤差の正負が,指定された丸めモードに基づいて前記第1の数値に適用される丸めの方向の正負と一致しない場合に,前記第2の数値に対して,前記丸めの方向に前記第2の精度に対応する丸め幅の補正を行う
ことを特徴とする数値丸め方法。
【請求項2】
前記丸めモードは,所定の数値範囲毎に丸めの方向を定めたルールである
ことを特徴とする請求項1に記載の数値丸め方法。
【請求項3】
所定の丸めモードで基数変換を行うコンピュータに,
第1の基数を用いて表される第1の数値を第2の基数を用いて第1の精度で表した第2の数値について,前記第1の数値を前記第2の基数を用いて前記第1の精度よりも高い第2の精度で表した第3の数値を基準とした誤差を算出し,
前記誤差の正負が,指定された丸めモードに基づいて前記第1の数値に適用される丸めの方向の正負と一致しない場合に,前記第2の数値に対して,前記丸めの方向に前記第2の精度に対応する丸め幅の補正を行う
処理を実行させるための数値丸めプログラム。
【請求項4】
前記丸めモードは,所定の数値範囲毎に丸めの方向を定めたルールである
ことを特徴とする請求項3に記載の数値丸めプログラム。
【請求項5】
所定の丸めモードで基数変換を行うコンピュータであって,
第1の基数を用いて表される第1の数値を第2の基数を用いて第1の精度で表した第2の数値について,前記第1の数値を前記第2の基数を用いて前記第1の精度よりも高い第2の精度で表した第3の数値を基準とした誤差を算出し,前記誤差の正負が,指定された丸めモードに基づいて前記第1の数値に適用される丸めの方向の正負と一致しない場合に,前記第2の数値に対して,前記丸めの方向に前記第2の精度に対応する丸め幅の補正を行う処理をコンピュータに実行させるための数値丸めプログラムを含むライブラリプログラムが格納されたライブラリ記憶部と,
丸めモードを指定する命令文を含むソースプログラムを入力し,入力したソースプログラムを解析することにより前記ライブラリ記憶部に格納されている数値丸めプログラムを含むライブラリプログラムを呼び出す命令が記述されたオブジェクトプログラムを出力するコンパイル部とを備える
ことを特徴とするコンピュータ。
【請求項6】
前記丸めモードは,所定の数値範囲毎に丸めの方向を定めたルールである
ことを特徴とする請求項5に記載のコンピュータ。
【請求項7】
所定の丸めモードで基数変換を行うコンピュータに,
丸めモードを指定する命令文を含むソースプログラムを入力し,
入力したソースプログラムを解析することにより,ライブラリ記憶部に格納されている,第1の基数を用いて表される第1の数値を第2の基数を用いて第1の精度で表した第2の数値について,前記第1の数値を前記第2の基数を用いて前記第1の精度よりも高い第2の精度で表した第3の数値を基準とした誤差を算出し,前記誤差の正負が,指定された丸めモードに基づいて前記第1の数値に適用される丸めの方向の正負と一致しない場合に,前記第2の数値に対して,前記丸めの方向に前記第2の精度に対応する丸め幅の補正を行う処理をコンピュータに実行させるための数値丸めプログラムを含むライブラリプログラムを呼び出す命令が記述されたオブジェクトプログラムを出力する
処理を実行させるためのコンパイルプログラム。
【請求項8】
前記丸めモードは,所定の数値範囲毎に丸めの方向を定めたルールである
ことを特徴とする請求項7に記載のコンパイルプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate