(57)【特許請求の範囲】
【請求項１】
所定の丸めモードで基数変換を行うコンピュータが，
第１の基数を用いて表される第１の数値を第２の基数を用いて第１の精度で表した第２の数値について，前記第１の数値を前記第２の基数を用いて前記第１の精度よりも高い第２の精度で表した第３の数値を基準とした誤差を算出し，
前記誤差の正負が，指定された丸めモードに基づいて前記第１の数値に適用される丸めの方向の正負と一致しない場合に，前記第２の数値に対して，前記丸めの方向に前記第２の精度に対応する丸め幅の補正を行う
ことを特徴とする数値丸め方法。
【請求項２】
前記丸めモードは，所定の数値範囲毎に丸めの方向を定めたルールである
ことを特徴とする請求項１に記載の数値丸め方法。
【請求項３】
所定の丸めモードで基数変換を行うコンピュータに，
第１の基数を用いて表される第１の数値を第２の基数を用いて第１の精度で表した第２の数値について，前記第１の数値を前記第２の基数を用いて前記第１の精度よりも高い第２の精度で表した第３の数値を基準とした誤差を算出し，
前記誤差の正負が，指定された丸めモードに基づいて前記第１の数値に適用される丸めの方向の正負と一致しない場合に，前記第２の数値に対して，前記丸めの方向に前記第２の精度に対応する丸め幅の補正を行う
処理を実行させるための数値丸めプログラム。
【請求項４】
前記丸めモードは，所定の数値範囲毎に丸めの方向を定めたルールである
ことを特徴とする請求項３に記載の数値丸めプログラム。
【請求項５】
所定の丸めモードで基数変換を行うコンピュータであって，
第１の基数を用いて表される第１の数値を第２の基数を用いて第１の精度で表した第２の数値について，前記第１の数値を前記第２の基数を用いて前記第１の精度よりも高い第２の精度で表した第３の数値を基準とした誤差を算出し，前記誤差の正負が，指定された丸めモードに基づいて前記第１の数値に適用される丸めの方向の正負と一致しない場合に，前記第２の数値に対して，前記丸めの方向に前記第２の精度に対応する丸め幅の補正を行う処理をコンピュータに実行させるための数値丸めプログラムを含むライブラリプログラムが格納されたライブラリ記憶部と，
丸めモードを指定する命令文を含むソースプログラムを入力し，入力したソースプログラムを解析することにより前記ライブラリ記憶部に格納されている数値丸めプログラムを含むライブラリプログラムを呼び出す命令が記述されたオブジェクトプログラムを出力するコンパイル部とを備える
ことを特徴とするコンピュータ。
【請求項６】
前記丸めモードは，所定の数値範囲毎に丸めの方向を定めたルールである
ことを特徴とする請求項５に記載のコンピュータ。
【請求項７】
所定の丸めモードで基数変換を行うコンピュータに，
丸めモードを指定する命令文を含むソースプログラムを入力し，
入力したソースプログラムを解析することにより，ライブラリ記憶部に格納されている，第１の基数を用いて表される第１の数値を第２の基数を用いて第１の精度で表した第２の数値について，前記第１の数値を前記第２の基数を用いて前記第１の精度よりも高い第２の精度で表した第３の数値を基準とした誤差を算出し，前記誤差の正負が，指定された丸めモードに基づいて前記第１の数値に適用される丸めの方向の正負と一致しない場合に，前記第２の数値に対して，前記丸めの方向に前記第２の精度に対応する丸め幅の補正を行う処理をコンピュータに実行させるための数値丸めプログラムを含むライブラリプログラムを呼び出す命令が記述されたオブジェクトプログラムを出力する
処理を実行させるためのコンパイルプログラム。
【請求項８】
前記丸めモードは，所定の数値範囲毎に丸めの方向を定めたルールである
ことを特徴とする請求項７に記載のコンパイルプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，数値の丸めを行う数値丸め方法，数値丸めプログラム，言語処理装置およびコンパイルプログラムに関するものである。
【背景技術】
【０００２】
コンピュータで数値演算を行う場合，数値に対して指定された精度で演算結果を丸める必要がある。計算機で扱われる数値の丸め方法としては，例えば，浮動小数点演算の標準規格であるＩＥＥＥ７５４で，方向丸めや最近接丸めなどの丸めモードが定義されている。
【０００３】
なお，数値丸めに関する技術として，計算器で演算結果を表示する際に，表示する演算結果の数値が丸められているかを，また表示する演算結果の数値が丸められている場合にその丸めの方向を，表示部に設けられたインディケータに表示する技術が知られている。また，符号，指数部，仮数部および誤差判定情報を含んだ入力データを受けて，精度付き浮動小数点演算を行い，誤差判定情報に誤差があるとしたときに所定のビットを精度情報として演算して出力データに加える技術が知られている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平５−１８９２０５号公報
【特許文献２】特開平２−１６５２２５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
数値の丸め方法を制御する際には，浮動小数点レジスタで設定されている丸めモードを変更する。浮動小数点レジスタは，ハードウェアのアーキテクチャによって，構造が異なる。
【０００６】
例えば，あるハードウェアＡの浮動小数点レジスタでは，浮動小数点レジスタ内で丸めモードを指すビット位置が，６４ビット中の３３・３４ビット目であるものとする。また，別のハードウェアＢの浮動小数点レジスタでは，浮動小数点レジスタ内で丸めモードを指すビット位置が，３２ビット中の１８・１９ビット目であるものとする。この場合，ハードウェアＡとハードウェアＢとで浮動小数点レジスタの構造が異なっているため，丸めモードを操作する処理を，ハードウェアＡとハードウェアＢとでは共通化することはできない。
【０００７】
このように，丸めモードを操作するためには，ハードウェアに依存する処理が必要であり，丸めモードを操作する処理を異なるハードウェア間で流用することができない，という問題がある。
【０００８】
また，すべてのハードウェアがすべての丸めモードをサポートしているわけではない。そのため，ハードウェアで対応していない丸めモードを実装することができない，という問題がある。
【０００９】
一側面では，本発明は，ハードウェアに設定された丸めモードとは異なる丸めモードに従った丸め結果を得ることが可能となる技術を提供することを目的とする。
【課題を解決するための手段】
【００１０】
１態様では，数値丸め方法は，所定の丸めモードで基数変換を行うコンピュータが，第１の基数を用いて表される第１の数値を第２の基数を用いて第１の精度で表した第２の数値について，第１の数値を第２の基数を用いて第１の精度よりも高い第２の精度で表した第３の数値を基準とした誤差を算出し，誤差の正負が，指定された丸めモードに基づいて第１の数値に適用される丸めの方向の正負と一致しない場合に，第２の数値に対して，丸めの方向に第２の精度に対応する丸め幅の補正を行う。
【発明の効果】
【００１１】
１態様では，ハードウェアに設定された丸めモードとは異なる丸めモードに従った丸め結果を得ることが可能となる。
【図面の簡単な説明】
【００１２】
【図１】本実施の形態による数値丸め部の構成例を示す図である。
【図２】本実施の形態による丸め結果の符号と誤差の符号との組合せに対応する丸め結果の補正処理を示す図である。
【図３】本実施の形態による数値丸め部が組み込まれた言語処理装置の構成例を示す図である。
【図４】本実施の形態による数値丸め部や言語処理装置を実現するハードウェアの構成例を示す図である。
【図５】本実施の形態によるソースプログラムの例を示す図である。
【図６】本実施の形態の実行形式プログラムに含まれる入力処理の例を示すフローチャートである。
【図７】本実施の形態の入力データ解析処理部による変換対象数値解析処理フローチャートである。
【図８】本実施の形態の第２精度基数変換部による第２精度基数変換処理フローチャートである。
【図９】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモード対応処理フローチャートである。
【図１０】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードＵＰ処理フローチャートである。
【図１１】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードＤＯＷＮ処理フローチャートである。
【図１２】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードＺＥＲＯ処理フローチャートである。
【図１３】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードＮＥＡＲＥＳＴ処理フローチャートである。
【図１４】本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードＣＯＭＰＡＴＩＢＬＥ処理フローチャートである。
【発明を実施するための形態】
【００１３】
以下，本実施の形態について，図を用いて説明する。
【００１４】
変換対象数値に対する基数変換を行う際に，指定された精度で基数変換の結果を丸める必要がある。例えば，１０進数で表される変換対象数値を２進数の値に基数変換する際に，基数変換の結果を４バイトの浮動小数点数で表すように指定されていれば，４バイトの浮動小数点数で表しきれない部分について，丸め処理が行われる。
【００１５】
コンピュータで浮動小数点数の丸め処理を行う方法としては，例えば，浮動小数点演算の標準規格であるＩＥＥＥ７５４で丸めモードが定義されている。浮動小数点数の丸めモードには，特定の方向の値に丸める方向丸めや，最近の値に丸める最近接丸めなどがある。
【００１６】
浮動小数点数の演算は，演算速度が遅いため，ハードウェアで演算を行う場合が多い。このとき，演算結果を特定の丸めモードを指定して丸める場合には，浮動小数点レジスタで設定されている丸めモードを変更して演算を行う必要がある。
【００１７】
しかし，浮動小数点レジスタは，ハードウェアのアーキテクチャによって構造が異なるため，丸めモードを操作する処理を，アーキテクチャが異なるハードウェア間で流用することができないという問題がある。また，すべてのハードウェアがすべての丸めモードをサポートしているわけではなく，ハードウェアがサポートしていない丸めモードに対応することはできないという問題もある。
【００１８】
また，浮動小数点レジスタで設定されている丸めモードを変更する場合，同一スレッドで行われる別の処理に対しても影響を及ぼすという問題がある。複数のファイルに対して読み書きを行うプログラムの場合，ファイル単位に丸めモードを指定してそれぞれのファイルへの読み書きが繰り返されると，丸めモードを変更するレジスタの読み書きが頻繁に発生するため，性能低下が懸念される。
【００１９】
以下では，基数変換で生じる誤差の丸めについて，ハードウェアに依存することなく，指定された丸めモードに従った丸め結果を得ることが可能となる，本実施の形態の技術について説明する。
【００２０】
本実施の形態の技術は，所定の丸めモードで基数変換を行うコンピュータが，第１の基数を用いて表される第１の数値を第２の基数を用いて第１の精度で表した第２の数値について，第１の数値を第２の基数を用いて第１の精度よりも高い第２の精度で表した第３の数値を基準とした誤差を算出し，誤差の正負が，指定された丸めモードに基づいて第１の数値に適用される丸めの方向の正負と一致しない場合に，第２の数値に対して，該丸めの方向に第２の精度に対応する丸め幅の補正を行う数値丸めに関する技術である。ここで，丸めモードは，所定の数値範囲毎に丸めの方向を定めたルールである。
【００２１】
例えば，第１の基数が１０進数であり，第１の数値がＡであれば，第１の基数を用いて表される第１の数値は，１０進数で表された数値Ａである。
【００２２】
さらに，例えば，第２の基数が２進数であり，第１の精度が４バイトの浮動小数点数の精度であり，第２の数値がＢであれば，第２の基数を用いて第１の精度で表した第２の数値は，２進数の４バイトの浮動小数点数で表された数値Ｂである。上記によると，数値Ｂは，数値Ａを１０進数から２進数に基数変換し，結果を４バイトの浮動小数点数に丸めた値となる。
【００２３】
さらに，例えば，第２の精度が８バイトの浮動小数点数の精度であり，第３の数値がＣであれば，第２の基数を用いて第２の精度で表した第３の数値は，２進数の８バイトの浮動小数点数で表された数値Ｃである。上記によると，数値Ｃは，数値Ａを１０進数から２進数に基数変換し，結果を８バイトの浮動小数点数に丸めた値となる。
【００２４】
このとき，例えば，上記の誤差は，Ｂ−Ｃとなる。この誤差の正負が，実際にコンピュータが基数変換で行った丸めの方向である。ここで，誤差Ｂ−Ｃの正負が，指定された丸めモードに基づいて第１の数値Ａに適用される丸めの方向の正負と一致しない場合に，第２の数値Ｂに対して，該丸めの方向に第２の精度に対応する丸め幅の補正が行われる。
【００２５】
以下では，このような本実施の形態の技術の例について説明する。
【００２６】
図１は，本実施の形態による数値丸め部の構成例を示す図である。
【００２７】
数値丸め部１０は，数値の基数変換時において，指定された丸めモードに応じた数値の丸めを行う。例えば，数値丸め部１０は，基数変換の対象となる数値の情報を入力し，指定された丸めモードで丸めが行われた基数変換の結果を出力する。
【００２８】
数値丸め部１０は，第２精度基数変換部１１，第２精度結果記憶部１２，第１精度基数変換部１３，第１精度結果記憶部１４，誤差算出部１５，誤差記憶部１６，丸め方向判定部１７，丸め結果補正部１８を備える。
【００２９】
第２精度基数変換部１１は，変換対象数値を，指定された第１の精度より高い第２の精度で基数変換する。第２精度基数変換部１１は，得られた第２の精度で基数変換した結果を，第２精度結果記憶部１２に記憶する。第２精度結果記憶部１２は，第２の精度で基数変換した結果を記憶する，コンピュータがアクセス可能なメモリ等の記憶部である。
【００３０】
第１精度基数変換部１３は，第２の精度で基数変換した結果を第１の精度で丸める。第１精度基数変換部１３は，第２の精度で基数変換した結果を第１の精度で丸める処理を，ハードウェア処理で行う。このとき，第１精度基数変換部１３は，浮動小数点レジスタの丸めモードの設定変更を行わない。
【００３１】
第２の精度で基数変換した結果を第１の精度で丸めた結果は，変換対象数値を，指定された第１の精度で基数変換した結果を示す。第１精度基数変換部１３は，得られた第１の精度で丸めた結果を，第１精度結果記憶部１４に記憶する。第１精度結果記憶部１４は，第１の精度で丸めた結果を記憶する，コンピュータがアクセス可能なメモリ等の記憶部である。
【００３２】
例えば，１０進数で表される変換対象数値を，２進数の浮動小数点数に基数変換するものとする。また，基数変換の結果は，４バイトの実数で表すように指定されているものとする。指定された４バイトの実数の精度が，指定された第１の精度となる。このとき，第２精度基数変換部１１は，例えば，基数変換の結果が指定された４バイトの実数より精度が高い８バイトの実数で表されるように，基数変換を行う。指定された４バイトの実数より精度が高い８バイトの実数の精度が，第２の精度となる。第１精度基数変換部１３は，８バイトの実数で表される基数変換の結果を，４バイトの実数に丸める。
【００３３】
誤差算出部１５は，第２の精度で基数変換した結果を第１の精度で丸めた結果と，第２の精度で基数変換した結果との誤差を算出する。算出された誤差は，第２の精度で基数変換した結果を第１の精度で丸めたときの丸め誤差となる。誤差算出部１５は，得られた誤差を，誤差記憶部１６に記憶する。誤差記憶部１６は，第２の精度で基数変換した結果を第１の精度で丸めたときの誤差を記憶する，コンピュータがアクセス可能なメモリ等の記憶部である。
【００３４】
例えば，上記の例において，誤差算出部１５は，８バイトの実数で表される基数変換の結果を４バイトの実数に丸めた結果から，８バイトの実数で表される基数変換の結果を差し引き，誤差を算出する。
【００３５】
丸め方向判定部１７は，誤差の符号から判断される第１の精度で丸めた結果における丸めの方向が，指定された丸めモードに従った丸めの方向に一致するかを判定する。
【００３６】
丸めが行われたときの結果は，正の方向に丸められた値か，負の方向に丸められた値かの２パターンに収束する。第２の精度で基数変換した結果は，第１の精度で丸めた結果よりも元の変換対象数値に近い値であるので，算出された誤差の符号は，第１の精度で丸めた結果における丸めの方向を表している。
【００３７】
例えば，誤差が，第１の精度で丸めた結果から第２の精度で基数変換した結果を差し引いて得られるものとする。このとき，誤差の符号が正であれば，第１の精度で丸めた結果における丸めの方向は，正の方向であり，誤差の符号が負であれば，第１の精度で丸めた結果における丸めの方向は，負の方向である。なお，誤差が第２の精度で基数変換した結果から第１の精度で丸めた結果を差し引いて得られる場合には，誤差の符号と第１の精度で丸めた結果における丸めの方向との関係は，逆の関係となる。
【００３８】
上述したように，本実施の形態による第１精度基数変換部１３は，第２の精度で基数変換した結果を第１の精度で丸める処理を，ハードウェアの丸めモードの設定変更を行わずに実行する。すなわち，第１の精度で丸めた結果における丸めの方向は，第２の精度で基数変換した結果が第１の精度で丸められたときに，実際にハードウェアで丸められた方向が正の方向であったのか負の方向であったのかを示している。これに対して，指定された丸めモードに従った丸めの方向は，第２の精度で基数変換した結果を第１の精度で丸める処理を，指定された丸めモードに従って行った場合の丸めの方向を示す。
【００３９】
第１の精度で丸めた結果における丸めの方向が指定された丸めモードに従った丸めの方向に一致するか否かは，誤差の符号や第１の精度で丸めた結果の符号などに基づいた，丸めモードに応じたアルゴリズムを用いて判定することができる。
【００４０】
丸め結果補正部１８は，第１の精度で丸めた結果における丸めの方向が，指定された丸めモードに従った丸めの方向に一致しない場合に，誤差の符号と第１の精度で丸めた結果の符号との関係から，第１の精度で丸めた結果を補正する。補正は，第１の精度で丸めた結果が指定された丸めモードに応じた値となるように，第１の精度で丸めた結果における丸めの方向を反対方向に変更した丸め結果に，第１の精度で丸めた結果を更新することを意味する。
【００４１】
第１の精度で丸めた結果における丸めの方向が分かれば，その反対方向に丸めが行われた場合の丸め結果も，第１の精度で丸めた結果の浮動小数点数をインクリメントまたはデクリメントすることで，容易に得ることができる。ただし，２進数の浮動小数点数で表される値をインクリメントまたはデクリメントした補正の結果は，その値の符号の正負によって，正の方向への補正であるか負の方向への補正であるかが異なる。丸め結果補正部１８は，誤差の符号と第１の精度で丸めた結果の符号との関係に応じて，第１の精度で丸めた結果をインクリメントまたはデクリメントする補正を行う。
【００４２】
図２は，本実施の形態による丸め結果の符号と誤差の符号との組合せに対応する丸め結果の補正処理を示す図である。
【００４３】
図２において，丸め結果の符号は，第１の精度で丸めた結果の符号を示す。誤差の符号は，第１の精度で丸めた結果から第２の精度で基数変換した結果を差し引いて算出された誤差の符号を示す。処理は，第１の精度で丸めた結果に対する補正処理を示す。
【００４４】
例えば，第１の精度で丸めた結果から第２の精度で基数変換した結果を差し引いて誤差が算出される場合に，算出された誤差の符号が正であれば，第１の精度で丸めた結果における丸めの方向は正の方向である。それが指定された丸めモードに従った丸めの方向に一致しなかった場合，丸め結果補正部１８は，第１の精度で丸めた結果を，反対の負の方向に丸めた結果に更新する補正を行う。
【００４５】
このとき，丸め結果補正部１８は，図２に示すように，第１の精度で丸めた結果の符号が正であれば，第１の精度で丸めた結果をデクリメントし，第１の精度で丸めた結果の符号が負であれば，第１の精度で丸めた結果をインクリメントする補正を行う。
【００４６】
また，例えば，第１の精度で丸めた結果から第２の精度で基数変換した結果を差し引いて誤差が算出される場合に，算出された誤差の符号が負であれば，第１の精度で丸めた結果における丸めの方向は負の方向である。それが指定された丸めモードに従った丸めの方向に一致しなかった場合，丸め結果補正部１８は，第１の精度で丸めた結果を，反対の正の方向に丸めた結果に更新する補正を行う。
【００４７】
このとき，丸め結果補正部１８は，図２に示すように，第１の精度で丸めた結果の符号が正であれば，第１の精度で丸めた結果をインクリメントし，第１の精度で丸めた結果の符号が負であれば，第１の精度で丸めた結果をデクリメントする補正を行う。
【００４８】
ここで，丸めモードに応じた，本実施の形態の丸め方向判定部１７と丸め結果補正部１８による処理の例を説明する。
【００４９】
上述したように，浮動小数点数の丸めモードには，特定の方向の値に丸める方向丸めや，最近の値に丸める最近接丸めなどがある。以下では，方向丸めとして“ＵＰ”，“ＤＯＷＮ”，“ＺＥＲＯ”の３つの丸めモードが，最近接丸めとして“ＮＥＡＲＥＳＴ”，“ＣＯＭＰＡＴＩＢＬＥ”の２つの丸めモードがあるものとして，説明を行う。
【００５０】
なお，以下の説明において，誤差は，丸めた結果から丸める前の元の値を差し引いて算出される値であるものとする。例えば，本実施の形態の例では，誤差は，第１の精度で丸めた結果から第２の精度で基数変換した結果を差し引いて算出される値となる。誤差が第２の精度で基数変換した結果から第１の精度で丸めた結果を差し引いて算出された値である場合には，以下の説明における誤差の符号の取り扱いを逆にする必要がある。
【００５１】
まず，指定された丸めモードが方向丸めである場合の例について説明する。
【００５２】
指定された丸めモードが方向丸めである場合には，丸め方向判定部１７は，第１の精度で丸めた結果の符号や誤差について，指定された丸めモードの定義に一致するかを判定する。第１の精度で丸めた結果の符号や誤差について，指定された丸めモードの定義に一致しない場合には，丸め方向判定部１７は，第１の精度で丸めた結果における丸めの方向が，指定された丸めモードに従った丸めの方向に一致しないと判定する。このとき，丸め結果補正部１８は，誤差の符号と第１の精度で丸めた結果の符号との関係から，第１の精度で丸めた結果を，第１の精度で丸めた結果における丸めの方向を反対方向に変更した丸め結果に更新する補正を行う。
【００５３】
本実施の形態において，“ＵＰ”は，正の無限大方向に丸めを行う丸めモードを示す。“ＵＰ”で丸めが行われた場合には，誤差は，必ず０以上になる。すなわち，誤差の符号が負である場合には，丸めた結果は，“ＵＰ”で丸めが行われた結果ではない。
【００５４】
例えば，指定された丸めモードが“ＵＰ”である場合に，算出された誤差の符号が負であれば，丸め方向判定部１７は，第１の精度で丸めた結果における丸めの方向が，指定された丸めモード“ＵＰ”に従った丸めの方向に一致しないと判定する。このとき，丸め結果補正部１８は，図２に示すように，第１の精度で丸めた結果の符号が正であれば，第１の精度で丸めた結果をインクリメントする補正を行い，第１の精度で丸めた結果の符号が負であれば，第１の精度で丸めた結果をデクリメントする補正を行う。
【００５５】
本実施の形態において，“ＤＯＷＮ”は，負の無限大方向に丸めを行う丸めモードを示す。“ＤＯＷＮ”で丸めが行われた場合には，誤差は，必ず０以下になる。すなわち，誤差の符号が正である場合には，丸めた結果は，“ＤＯＷＮ”で丸めが行われた結果ではない。
【００５６】
例えば，指定された丸めモードが“ＤＯＷＮ”である場合に，算出された誤差の符号が正であれば，丸め方向判定部１７は，第１の精度で丸めた結果における丸めの方向が，指定された丸めモード“ＤＯＷＮ”に従った丸めの方向に一致しないと判定する。このとき，丸め結果補正部１８は，図２に示すように，第１の精度で丸めた結果の符号が正であれば，第１の精度で丸めた結果をデクリメントする補正を行い，第１の精度で丸めた結果の符号が負であれば，第１の精度で丸めた結果をインクリメントする補正を行う。
【００５７】
本実施の形態において，“ＺＥＲＯ”は，０に近づく方向に丸めを行う丸めモードを示す。“ＺＥＲＯ”で丸めが行われた場合には，誤差は，丸めた結果と符号が異なる値になるか，０になる。すなわち，誤差の符号と丸めた結果の符号とが一致する場合には，丸めた結果は，“ＺＥＲＯ”で丸めが行われた結果ではない。
【００５８】
例えば，指定された丸めモードが“ＺＥＲＯ”である場合に，算出された誤差の符号と第１の精度で丸めた結果の符号とが一致すれば，丸め方向判定部１７は，第１の精度で丸めた結果における丸めの方向が，指定された丸めモード“ＺＥＲＯ”に従った丸めの方向に一致しないと判定する。このとき，丸め結果補正部１８は，図２に示すように，第１の精度で丸めた結果をデクリメントする補正を行う。
【００５９】
次に，指定された丸めモードが最近接丸めである場合の例について説明する。
【００６０】
最近接丸めにおいて，“ＮＥＡＲＥＳＴ”と“ＣＯＭＰＡＴＩＢＬＥ”は，いずれも，表現できる最も近くの値に丸めを行う丸めモードを示す。すなわち，“ＮＥＡＲＥＳＴ”と“ＣＯＭＰＡＴＩＢＬＥ”は，いずれも誤差が小さくなる方向への丸めを行う丸めモードである。
【００６１】
ただし，“ＮＥＡＲＥＳＴ”と“ＣＯＭＰＡＴＩＢＬＥ”では，丸める前の元の値が丸め結果として表現可能な２つの値の中間値であった場合の処理が異なる。すなわち，“ＮＥＡＲＥＳＴ”と“ＣＯＭＰＡＴＩＢＬＥ”では，丸める前の元の値と丸め結果として表現可能な２つの値との間の誤差の絶対値が同じになる場合の処理が異なる。
【００６２】
“ＮＥＡＲＥＳＴ”では，丸める前の元の値が丸め結果として表現可能な２つの値の中間値である場合に，丸め結果が偶数となる方向への丸めが行われる。すなわち，丸め結果が浮動小数点数で表現される場合には，丸め結果の最下位ビットが０になるように丸め処理が行われる。
【００６３】
これに対して，“ＣＯＭＰＡＴＩＢＬＥ”では，丸める前の元の値が丸め結果として表現可能な２つの値の中間値である場合に，０から離れる方向への丸めが行われる。
【００６４】
“ＮＥＡＲＥＳＴ”と“ＣＯＭＰＡＴＩＢＬＥ”との違いを，具体例で説明する。ここでは，分かりやすく説明するために，１０進数の例を用いて説明を行う。
【００６５】
例えば，１０進数の値「２．２」を整数に丸める例を考える。丸め結果として表現可能な２つの値は，「２」または「３」である。２つの値のうち，元の値「２．２」との誤差が小さくなるのは「２」であるので，丸めモードが“ＮＥＡＲＥＳＴ”である場合でも，“ＣＯＭＰＡＴＩＢＬＥ”である場合でも，ともに丸め結果は「２」となる。
【００６６】
また，例えば，１０進数の値「２．５」を整数に丸める例を考える。丸め結果として表現可能な２つの値は，「２」または「３」である。元の値「２．５」と２つの値との誤差は，ともに等しい「０．５」となる。このとき，丸めモードが“ＮＥＡＲＥＳＴ”である場合には，丸め結果が偶数になるように値の丸めが行われる。丸めモードが“ＮＥＡＲＥＳＴ”である場合の丸め結果は，「２」となる。これに対して，丸めモードが“ＣＯＭＰＡＴＩＢＬＥ”である場合には，丸め結果が「０」から遠くなるように値の丸めが行われる。丸めモードが“ＣＯＭＰＡＴＩＢＬＥ”である場合の丸め結果は，「３」となる。
【００６７】
指定された丸めモードが最近接丸めである場合には，丸め方向判定部１７は，第１の精度で丸めた結果における丸めの方向を反対方向に変更した，もう１つのパターンの丸め結果を求める。ここでは，第１の精度で丸めた結果における丸めの方向を反対方向に変更した，もう１つのパターンの丸め結果を，反対方向丸め結果と呼ぶ。丸め方向判定部１７は，図２に示すように，第１の精度で丸めた結果の符号と誤差の符号との関係に基づいて，第１の精度で丸めた結果の浮動小数点数をインクリメントまたはデクリメントすることで，反対方向丸め結果を得ることができる。
【００６８】
丸め方向判定部１７は，反対方向丸め結果と第２の精度で基数変換した結果との誤差を求める。丸め方向判定部１７は，第１の精度で丸めた結果と第２の精度で基数変換した結果との誤差の絶対値と，反対方向丸め結果と第２の精度で基数変換した結果との誤差の絶対値とを比較する。丸め方向判定部１７は，誤差の絶対値が小さい方の丸め結果における丸めの方向を，指定された丸めモードに従った丸めの方向と判断する。
【００６９】
なお，双方の誤差の絶対値が一致する場合には，丸め方向判定部１７は，指定された丸めモードに応じた判断を行う。例えば，指定された丸めモードが“ＮＥＡＲＥＳＴ”である場合には，丸め方向判定部１７は，浮動小数点数の最終ビットが０である丸め結果における丸めの方向を，指定された丸めモードに従った丸めの方向と判断する。また，指定された丸めモードが“ＣＯＭＰＡＴＩＢＬＥ”である場合には，丸め方向判定部１７は，浮動小数点数の仮数部の値が大きい方の丸め結果における丸めの方向を，指定された丸めモードに従った丸めの方向と判断する。
【００７０】
丸め方向判定部１７は，反対方向丸め結果における丸めの方向を指定された丸めモードに従った丸めの方向と判断した場合に，第１の精度で丸めた結果における丸めの方向が，指定された丸めモードに従った丸めの方向に一致しないと判定する。このとき，丸め結果補正部１８は，反対方向丸め結果で第１の精度で丸めた結果を更新する補正を行う。丸め方向判定部１７で算出された反対方向丸め結果は，誤差の符号と第１の精度で丸めた結果の符号との関係から，第１の精度で丸めた結果における丸めの方向を反対方向に変更した丸め結果である。
【００７１】
ここで説明した丸めモードは一例であるので，図１に示す数値丸め部１０は，必ずしもこれらの丸めモードのすべてに対応していなくてもよく，いずれか複数に対応できるものであればよい。また，図１に示す数値丸め部１０が，ここで説明した丸めモード以外の丸めモードに対応していてもよい。
【００７２】
このように，図１に示す数値丸め部１０によって，ハードウェアのアーキテクチャに依らずに，指定された丸めモードに従った丸め結果を得ることができる。
【００７３】
図３は，本実施の形態による数値丸め部が組み込まれた言語処理装置の構成例を示す図である。
【００７４】
図３に示す言語処理装置２０は，図１に示す数値丸め部１０が組み込まれた装置の一例である。言語処理装置２０は，プログラミング言語で記述されたソースプログラム４０を翻訳し，コンピュータで実行可能な実行形式プログラム４２を生成する。言語処理装置２０は，コンパイル部２１，リンカ部２４，ライブラリ記憶部３０を備える。
【００７５】
コンパイル部２１は，プログラミング言語で記述されたソースプログラム４０をコンパイルし，オブジェクトプログラム４１を生成するコンパイラである。
【００７６】
本実施の形態において，コンパイル部２１は，丸めモードを指定する命令文を含むソースプログラム４０を入力する。コンパイル部２１は，入力したソースプログラムを解析することにより，ライブラリ記憶部３０に格納されている，図１に示す数値丸め部１０を実現するプログラムを含むライブラリプログラムを呼び出す命令が記述されたオブジェクトプログラム４１を出力する。
【００７７】
本実施の形態によるコンパイル部２１は，丸めモード指定命令解析部２２，ライブラリ呼出し命令生成部２３を備える。丸めモード指定命令解析部２２は，ソースプログラム４０に含まれる丸めモードを指定する命令文を解析する。ライブラリ呼出し命令生成部２３は，丸めモード指定命令解析部２２が解析した結果に従って，ライブラリ記憶部３０に格納されたライブラリプログラムを呼び出す命令を，オブジェクトプログラム４１内に出力する。
【００７８】
リンカ部２４は，オブジェクトプログラム４１と，ライブラリ記憶部３０に格納された各種のライブラリプログラムとを結合し，実行形式プログラム４２を生成するリンカである。実行形式プログラム４２とライブラリプログラムとのリンクは，動的リンクであってもよいし，静的リンクであってもよい。
【００７９】
ライブラリ記憶部３０は，汎用性の高い複数のライブラリプログラムを再利用可能な形で記憶する，コンピュータがアクセス可能な記憶部である。本実施の形態によるライブラリ記憶部３０には，図１に示す数値丸め部１０を実現するプログラムを含むライブラリプログラムが格納されている。
【００８０】
ライブラリ記憶部３０は，ライブラリプログラムによる処理手段として，例えば，ファイルオープン処理部３１，ファイル読み込み処理部３２，入力データ解析処理部３３，入力値設定処理部３４などを備える。
【００８１】
ファイルオープン処理部３１は，ファイルのデータを読み込むための準備をするＯＰＥＮ命令を処理する。ファイル読み込み処理部３２は，ファイルのデータを読み込む処理を行う。入力データ解析処理部３３は，ファイルから読み込まれたデータを解析する処理を行う。
【００８２】
入力値設定処理部３４は，ファイルから読み込まれたデータを，利用者が指定した丸めモード，すなわちソースプログラム４０の命令文で記述された丸めモードに従って加工し，実行形式プログラム４２に引き渡す処理を行う。本実施の形態による入力値設定処理部３４は，図１に示す数値丸め部１０を備え，その数値丸め部１０による結果の値を，実行形式プログラム４２に返却する。
【００８３】
実行形式プログラム４２が実行された際に，データの入力処理４３では，ファイル読み込み処理部３２，入力データ解析処理部３３，入力値設定処理部３４等を実現するライブラリプログラムが呼び出され，実行される。このとき，入力値設定処理部３４を実現するプログラムに含まれる，数値丸め部１０を実現するプログラムによる処理が行われる。
【００８４】
図３に示す言語処理装置２０や，言語処理装置２０が備えるコンパイル部２１を実現するプログラムによって，図１に示す数値丸め部１０を実現するプログラムを含むライブラリプログラムを呼び出して実行する実行形式プログラム４２が生成される。これにより，ハードウェアの設定を変更することなく，利用者に指定された丸めモードに従った丸め処理を実行することが可能な実行形式プログラム４２の生成が可能となる。
【００８５】
図４は，本実施の形態による数値丸め部や言語処理装置を実現するハードウェアの構成例を示す図である。
【００８６】
図１に示す数値丸め部１０や図３に示す言語処理装置２０は，例えば，ＣＰＵ（Central Processing Unit ）２，主記憶となるメモリ３，記憶装置４，通信装置５，媒体読取・書込装置６，入力装置７，出力装置８等を備えるコンピュータ１によって実現される。記憶装置４は，例えばＨＤＤ（Hard Disk Drive ）などである。媒体読取・書込装置６は，例えばＣＤ−Ｒ（Compact Disc Recordable ）ドライブやＤＶＤ−Ｒ（Digital Versatile Disc Recordable ）ドライブなどである。入力装置７は，例えばキーボード・マウスなどである。出力装置８は，例えばディスプレイ等の表示装置などである。
【００８７】
図１に示す数値丸め部１０および数値丸め部１０が備える各機能部や，図３に示す言語処理装置２０および言語処理装置２０が備える各機能部は，コンピュータ１が備えるＣＰＵ２，メモリ３等のハードウェアと，ソフトウェアプログラムとによって実現することが可能である。コンピュータ１が実行可能なプログラムは，記憶装置４に記憶され，その実行時にメモリ３に読み出され，ＣＰＵ２により実行される。
【００８８】
コンピュータ１は，可搬型記録媒体から直接プログラムを読み取り，そのプログラムに従った処理を実行することもできる。また，コンピュータ１は，サーバコンピュータからプログラムが転送されるごとに，逐次，受け取ったプログラムに従った処理を実行することもできる。さらに，このプログラムは，コンピュータ１で読み取り可能な記録媒体に記録しておくことができる。
【００８９】
図５は，本実施の形態によるソースプログラムの例を示す図である。
【００９０】
図５に示すソースプログラム４０は，Ｆｏｒｔｒａｎの文法規則に従って記述されたソースプログラム４０の例である。図５に示すソースプログラム４０には，丸めモードを指定する命令文が含まれている。
【００９１】
図５に示すソースプログラム４０において，命令文（ａ）は，４バイトの実数ｒ１，ｒ２を宣言する命令文である。実数ｒ１，ｒ２は，それぞれ入力値を格納するために使用される。
【００９２】
命令文（ｂ）は，“ｗｏｒｋ１．ｄａｔａ”というファイルを開き，装置番号１として識別可能な状態にすることを指示する命令文である。命令文（ｂ）は，このファイルからデータを入出力する場合の丸め方法に，“ＵＰ”の丸めモードを適用することを指示している。また，命令文（ｃ）は，“ｗｏｒｋ２．ｄａｔａ”というファイルを開き，装置番号２として識別可能な状態にすることを指示する命令文である。命令文（ｃ）は，このファイルからデータを入出力する場合の丸め方法に，“ＤＯＷＮ”の丸めモードを適用することを指示している。
【００９３】
命令文（ｄ）は，装置番号１のファイルから数値を表す文字列のデータを読み込み，実数ｒ１に保持することを指示している。また，命令文（ｅ）は，装置番号２のファイルから数値を表す文字列のデータを読み込み，実数ｒ２に保持することを指示している。
【００９４】
図５に示すソースプログラム４０を，図３に示す言語処理装置２０のコンパイル部２１が入力し，コンパイル処理を行うものとする。
【００９５】
図５に示すソースプログラム４０の命令文（ｂ），（ｃ）に対して，コンパイル部２１は，ライブラリ呼出し命令生成部２３によって，それぞれファイルオープン処理部３１を呼び出す命令を生成する。このとき，命令文（ｂ），（ｃ）には，丸めモードが指定されているので，丸めモード指定命令解析部２２によって解析した丸めモードの情報が，実行形式プログラム４２の実行時にファイルオープン処理部３１にパラメータとして通知される。ファイルオープン処理部３１は，指定されたファイルに対するオープン処理を実行するとともに，指定された丸めモードの情報を記憶する。
【００９６】
また，コンパイル部２１は，命令文（ｄ），（ｅ）に対して，それぞれライブラリ呼出し命令生成部２３によって，ファイル読み込み処理部３２，入力データ解析処理部３３，入力値設定処理部３４を呼び出す命令を生成する。実行形式プログラム４２の実行において，命令文（ｄ），（ｅ）に相当する入力処理４３の実行時に，本実施の形態の数値丸め部１０による処理が実行される。
【００９７】
以下，図３に示す実行形式プログラム４２に含まれるファイルからデータを入力する入力処理４３のフローチャートを例として，本実施の形態の数値丸め部１０による処理の流れの例を説明する。
【００９８】
図６は，本実施の形態の実行形式プログラムに含まれる入力処理の例を示すフローチャートである。
【００９９】
図６に示す実行形式プログラム４２に含まれる入力処理４３の例では，実行形式プログラム４２から呼び出されたファイル読み込み処理部３２，入力データ解析処理部３３，入力値設定処理部３４による処理が行われる。
【０１００】
なお，ここでは，ファイルのデータは，１０進数を文字列で表現したデータであるものとする。入力処理４３では，変換対象数値である１０進数のデータを２進数に変換する基数変換が行われる。
【０１０１】
入力処理４３において，ファイル読み込み処理部３２は，変換対象数値の取得，すなわち１０進数を表す文字列データの読み込みを行う（ステップＳ１０）。例えば，ファイルから入力される文字列データが，１０進数を表す「１２３．４５６７８９」であるものとする。この文字列データでは，小数点を含めて１つ１つの数字が，例えば１バイトの文字コードで表されている。
【０１０２】
入力データ解析処理部３３は，入力された変換対象数値である文字列データを解析する変換対象数値解析処理を実行する（ステップＳ１１）。変換対象数値解析処理では，後の基数変換のための事前処理が行われる。変換対象数値解析処理の詳細については，後述する。
【０１０３】
入力値設定処理部３４の数値丸め部１０において，第２精度基数変換部１１は，第２精度基数変換処理を実行する（ステップＳ１２）。第２精度基数変換処理では，変換対象数値を，プログラムで指定された第１の精度より高い第２の精度で基数変換する処理が行われる。第２精度基数変換処理の詳細については，後述する。
【０１０４】
第１精度基数変換部１３は，変換対象数値を第２の精度で基数変換した結果を，第１の精度で丸める（ステップＳ１３）。以下では，変換対象数値を第２の精度で基数変換した結果を，Ｓとする。Ｓは，第２の精度で表された２進数の浮動小数点数である。また，第１の精度で丸めた結果を，Ｙとする。Ｙは，第２の精度よりも低い第１の精度で表された２進数の浮動小数点数である。例えばＹが４バイトの浮動小数点数である場合に，例えばＳは８バイトの浮動小数点数である。第２の精度で表されるＳを，第１の精度で表されるＹに丸める処理は，浮動小数点数の演算となるので，ハードウェアを用いた処理となる。第１精度基数変換部１３は，ハードウェアに，Ｓをプログラムで指定された型の実数Ｙに丸める命令を行う。
【０１０５】
誤差算出部１５は，第２の精度で基数変換した結果と，その第２の精度で基数変換した結果を第１の精度で丸めた結果との誤差を算出する（ステップＳ１４）。以下では，誤差を，Ｄとする。ここでは，誤差Ｄを，Ｙ−Ｓの演算で求めるものとする。
【０１０６】
丸め方向判定部１７は，Ｄ＝０であるかを判定する（ステップＳ１５）。Ｄ＝０である場合には（ステップＳ１５のＹＥＳ），第１の精度で丸めた結果Ｙの補正は行わない。Ｄ＝０でない場合には（ステップＳ１５のＮＯ），丸め方向判定部１７および丸め結果補正部１８による丸めモード対応処理を実行する（ステップＳ１６）。丸めモード対応処理では，指定された丸めモードに応じた，第１の精度で丸めた結果における丸めの方向が指定された丸めモードに従ったものであるかを判定する処理や，第１の精度で丸めた結果を補正する処理が行われる。丸めモード対応処理の詳細については，後述する。
【０１０７】
入力値設定処理部３４は，補正も含めた最終的な第１の精度で丸めた結果を入力値として設定し（ステップＳ１７），呼び出し元の実行形式プログラム４２に返却する。
【０１０８】
図７は，本実施の形態の入力データ解析処理部による変換対象数値解析処理フローチャートである。
【０１０９】
図７に示す変換対象数値解析処理では，後の基数変換のために，入力されたデータを解析する事前処理が行われる。ここでは，図３に示す入力データ解析処理部３３により変換対象数値解析処理が行われる例を示すが，図１に示す第２精度基数変換部１１が変換対象数値解析処理を含めた処理を行うようにしてもよい。
【０１１０】
入力データ解析処理部３３は，ファイルから読み込んだ文字列データについて，小数点の位置と，指数表現の指数値とを解析する（ステップＳ２０）。指数表現では，仮数部と指数部との間に“ｅ”や“Ｅ”などの記号を挟んで，例えば，２．０×１０5 を“２．０ｅ５”などと表す。例えば，入力された文字列データが「１２３．４５６７８９」である場合に，入力データ解析処理部３３は，解析によって，小数点が先頭から４文字目の位置にあり，指数表現の指数値がないという情報を得る。
【０１１１】
入力データ解析処理部３３は，入力された文字列データから小数点と指数表現とを除外した文字列ｃを生成する（ステップＳ２１）。入力データ解析処理部３３は，生成された文字列ｃをメモリに保持する。
【０１１２】
また，入力データ解析処理部３３は，小数点位置を補正する数値ｅを求める（ステップＳ２２）。数値ｅは，次の式が成り立つ値となる。
【０１１３】
０．［文字列ｃ］×１０のｅ乗  ＝  入力された文字列データで表される数値
入力データ解析処理部３３は，求めた数値ｅをメモリに保持する。
【０１１４】
例えば，入力された文字列データが「１２３．４５６７８９」である場合，文字列ｃは「１２３４５６７８９」となり，ｅ＝３となる。
【０１１５】
入力データ解析処理部３３は，文字列ｃの桁数ｆを求める（ステップＳ２３）。例えば，文字列ｃが「１２３４５６７８９」である場合，桁数ｆ＝９である。
【０１１６】
図８は，本実施の形態の第２精度基数変換部による第２精度基数変換処理フローチャートである。
【０１１７】
図８に示すフローチャートにおいて，第２精度基数変換部１１は，変換対象数値の情報として，図７に示す変換対象数値解析処理により得られた文字列ｃ，数値ｅ，桁数ｆを用いて，１０進数から２進数への基数変換を第２の精度で実行する。なお，図８に示すフローチャートにおいて，文字ｃ［ｉ］（ｉ＝０，１，…）は，文字列ｃの文字を左から順に表した配列である。
【０１１８】
第２精度基数変換部１１は，２進数の浮動小数点数であるＳを０に初期化し，カウンタｉを０に初期化する（ステップＳ３０）。
【０１１９】
第２精度基数変換部１１は，ｉ＜ｆであるかを判定する（ステップＳ３１）。ここでは，文字列ｃにおけるすべての文字について処理が終了したかが判定されている。
【０１２０】
ｉ＜ｆであれば（ステップＳ３１のＹＥＳ），第２精度基数変換部１１は，文字ｃ［ｉ］を数値ｘに変換する（ステップＳ３２）。ここでは，文字コードで数字を表す文字ｃ［ｉ］を，２進整数の数値ｘに変換する。
【０１２１】
第２精度基数変換部１１は，Ｓ×１０＋ｘの演算結果を新たなＳとする（ステップＳ３３）。Ｓの演算は浮動小数点数の演算となるので，ステップＳ３３の処理は，ハードウェアを用いた処理となる。第２精度基数変換部１１は，カウンタｉをインクリメントし（ステップＳ３４），ステップＳ３１の処理に戻る。
【０１２２】
ｉ＜ｆでなければ（ステップＳ３１のＮＯ），第２精度基数変換部１１は，Ｓに１０の（ｅ−ｆ）乗を掛ける演算を行う（ステップＳ３５）。ここでは，文字列ｃで表されるすべての桁の数値についての処理の終了後に，指数についての処理が行われている。Ｓの演算は浮動小数点数の演算となるので，ステップＳ３５の処理は，ハードウェアを用いた処理となる。
【０１２３】
ステップＳ３５の処理で得られたＳが，変換対象数値を，指定された第１の精度より高い第２の精度で基数変換した結果となる。
【０１２４】
図９は，本実施の形態の丸め方向判定部および丸め結果補正部による丸めモード対応処理フローチャートである。
【０１２５】
図９に示すフローチャートは，プログラムで指定された丸めモードに応じて，第１の精度で丸めた結果における丸めの方向の判定や，第１の精度で丸めた結果の補正を行う処理のフローチャートである。ここでは，プログラムにより指定される丸めモードが，“ＵＰ”，“ＤＯＷＮ”，“ＺＥＲＯ”，“ＮＥＡＲＥＳＴ”，“ＣＯＭＰＡＴＩＢＬＥ”のいずれかであるものとする。
【０１２６】
丸め方向判定部１７は，指定された丸めモードを判定する（ステップＳ４０）。
【０１２７】
指定された丸めモードが“ＵＰ”である場合には（ステップＳ４０の“ＵＰ”），丸め方向判定部１７および丸め結果補正部１８による，丸めモードＵＰ処理が実行される（ステップＳ４１）。丸めモードＵＰ処理の詳細については，後述する。
【０１２８】
指定された丸めモードが“ＤＯＷＮ”である場合には（ステップＳ４０の“ＤＯＷＮ”），丸め方向判定部１７および丸め結果補正部１８による，丸めモードＤＯＷＮ処理が実行される（ステップＳ４２）。丸めモードＤＯＷＮ処理の詳細については，後述する。
【０１２９】
指定された丸めモードが“ＺＥＲＯ”である場合には（ステップＳ４０の“ＺＥＲＯ”），丸め方向判定部１７および丸め結果補正部１８による，丸めモードＺＥＲＯ処理が実行される（ステップＳ４３）。丸めモードＺＥＲＯ処理の詳細については，後述する。
【０１３０】
指定された丸めモードが“ＮＥＡＲＥＳＴ”である場合には（ステップＳ４０の“ＮＥＡＲＥＳＴ”），丸め方向判定部１７および丸め結果補正部１８による，丸めモードＮＥＡＲＥＳＴ処理が実行される（ステップＳ４４）。丸めモードＮＥＡＲＥＳＴ処理の詳細については，後述する。
【０１３１】
指定された丸めモードが“ＣＯＭＰＡＴＩＢＬＥ”である場合には（ステップＳ４０の“ＣＯＭＰＡＴＩＢＬＥ”），丸め方向判定部１７および丸め結果補正部１８による，丸めモードＣＯＭＰＡＴＩＢＬＥ処理が実行される（ステップＳ４５）。丸めモードＣＯＭＰＡＴＩＢＬＥ処理の詳細については，後述する。
【０１３２】
図１０は，本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードＵＰ処理フローチャートである。
【０１３３】
図１０に示すフローチャートにおいて，Ｄは，図６のステップＳ１４の処理で算出された誤差である。Ｙは，図６のステップＳ１３の処理で得られた第１の精度に丸めた結果である。なお，ＩＮＣ（Ｙ）は，浮動小数点数のＹをインクリメントした結果を表し，ＤＥＣ（Ｙ）は，浮動小数点数のＹをデクリメントした結果を表す。
【０１３４】
丸め方向判定部１７は，Ｄ＜０であるかを判定する（ステップＳ５０）。
【０１３５】
Ｄ＜０でなければ（ステップＳ５０のＮＯ），Ｙにおける丸めの方向は，指定された丸めモード“ＵＰ”に従った方向である。このとき，数値丸め部１０は，Ｙの補正を行わずに処理を終了する。
【０１３６】
Ｄ＜０であれば（ステップＳ５０のＹＥＳ），Ｙにおける丸めの方向は，指定された丸めモード“ＵＰ”に従った方向の反対方向である。このとき，丸め結果補正部１８は，Ｙを補正する。丸め結果補正部１８は，Ｙ＞０であるかを判定する（ステップＳ５１）。Ｙ＞０であれば（ステップＳ５１のＹＥＳ），丸め結果補正部１８は，ＹをＩＮＣ（Ｙ）で更新する補正を行う（ステップＳ５２）。Ｙ＞０でなければ（ステップＳ５１のＮＯ），丸め結果補正部１８は，ＹをＤＥＣ（Ｙ）で更新する補正を行う（ステップＳ５３）。
【０１３７】
図１１は，本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードＤＯＷＮ処理フローチャートである。
【０１３８】
図１１に示すフローチャートにおいて，Ｄは，図６のステップＳ１４の処理で算出された誤差である。Ｙは，図６のステップＳ１３の処理で得られた第１の精度に丸めた結果である。なお，ＩＮＣ（Ｙ）は，浮動小数点数のＹをインクリメントした結果を表し，ＤＥＣ（Ｙ）は，浮動小数点数のＹをデクリメントした結果を表す。
【０１３９】
丸め方向判定部１７は，Ｄ＞０であるかを判定する（ステップＳ６０）。
【０１４０】
Ｄ＞０でなければ（ステップＳ６０のＮＯ），Ｙにおける丸めの方向は，指定された丸めモード“ＤＯＷＮ”に従った方向である。このとき，数値丸め部１０は，Ｙの補正を行わずに処理を終了する。
【０１４１】
Ｄ＞０であれば（ステップＳ６０のＹＥＳ），Ｙにおける丸めの方向は，指定された丸めモード“ＤＯＷＮ”に従った方向の反対方向である。このとき，丸め結果補正部１８は，Ｙを補正する。丸め結果補正部１８は，Ｙ＞０であるかを判定する（ステップＳ６１）。Ｙ＞０であれば（ステップＳ６１のＹＥＳ），丸め結果補正部１８は，ＹをＤＥＣ（Ｙ）で更新する補正を行う（ステップＳ６２）。Ｙ＞０でなければ（ステップＳ６１のＮＯ），丸め結果補正部１８は，ＹをＩＮＣ（Ｙ）で更新する補正を行う（ステップＳ６３）。
【０１４２】
図１２は，本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードＺＥＲＯ処理フローチャートである。
【０１４３】
図１２に示すフローチャートにおいて，Ｄは，図６のステップＳ１４の処理で算出された誤差である。Ｙは，図６のステップＳ１３の処理で得られた第１の精度に丸めた結果である。なお，ＤＥＣ（Ｙ）は，浮動小数点数のＹをデクリメントした結果を表す。
【０１４４】
丸め方向判定部１７は，Ｄ＞０であるかを判定する（ステップＳ７０）。
【０１４５】
Ｄ＞０であれば（ステップＳ７０のＹＥＳ），丸め方向判定部１７は，Ｙ＞０であるかを判定する（ステップＳ７１）。Ｙ＞０でなければ（ステップＳ７１のＮＯ），Ｙにおける丸めの方向は，指定された丸めモード“ＺＥＲＯ”に従った方向である。このとき，数値丸め部１０は，Ｙの補正を行わずに処理を終了する。Ｙ＞０であれば（ステップＳ７１のＹＥＳ），Ｙにおける丸めの方向は，指定された丸めモード“ＺＥＲＯ”に従った方向の反対方向である。このとき，丸め結果補正部１８は，Ｙを補正する。丸め結果補正部１８は，ＹをＤＥＣ（Ｙ）で更新する補正を行う（ステップＳ７２）。
【０１４６】
Ｄ＞０でなければ（ステップＳ７０のＮＯ），丸め方向判定部１７は，Ｙ＞０であるかを判定する（ステップＳ７３）。Ｙ＞０であれば（ステップＳ７３のＹＥＳ），Ｙにおける丸めの方向は，指定された丸めモード“ＺＥＲＯ”に従った方向である。このとき，数値丸め部１０は，Ｙの補正を行わずに処理を終了する。Ｙ＞０でなければ（ステップＳ７３のＮＯ），Ｙにおける丸めの方向は，指定された丸めモード“ＺＥＲＯ”に従った方向の反対方向である。このとき，丸め結果補正部１８は，Ｙを補正する。丸め結果補正部１８は，ＹをＤＥＣ（Ｙ）で更新する補正を行う（ステップＳ７４）。
【０１４７】
図１３は，本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードＮＥＡＲＥＳＴ処理フローチャートである。
【０１４８】
図１３に示すフローチャートにおいて，Ｄは，図６のステップＳ１４の処理で算出された誤差である。Ｙは，図６のステップＳ１３の処理で得られた第１の精度に丸めた結果である。Ｓは，図６のステップＳ１２の処理で得られた第２の精度で基数変換された結果である。なお，ＩＮＣ（Ｙ）は，浮動小数点数のＹをインクリメントした結果を表し，ＤＥＣ（Ｙ）は，浮動小数点数のＹをデクリメントした結果を表す。Ｙ’は，Ｙにおける丸めの方向を反対方向に変更した，もう１つのパターンの丸め結果を表す。Ｄ’は，ＳからＹ’への丸め誤差を表す。
【０１４９】
丸め方向判定部１７は，Ｄ＞０であるかを判定する（ステップＳ８０）。
【０１５０】
Ｄ＞０であれば（ステップＳ８０のＹＥＳ），丸め方向判定部１７は，Ｙ＞０であるかを判定する（ステップＳ８１）。Ｙ＞０であれば（ステップＳ８１のＹＥＳ），丸め方向判定部１７は，ＤＥＣ（Ｙ）の値をＹ’とする（ステップＳ８２）。Ｙ＞０でなければ（ステップＳ８１のＮＯ），丸め方向判定部１７は，ＩＮＣ（Ｙ）の値をＹ’とする（ステップＳ８３）。
【０１５１】
Ｄ＞０でなければ（ステップＳ８０のＮＯ），丸め方向判定部１７は，Ｙ＞０であるかを判定する（ステップＳ８４）。Ｙ＞０であれば（ステップＳ８４のＹＥＳ），丸め方向判定部１７は，ＩＮＣ（Ｙ）の値をＹ’とする（ステップＳ８５）。Ｙ＞０でなければ（ステップＳ８４のＮＯ），丸め方向判定部１７は，ＤＥＣ（Ｙ）の値をＹ’とする（ステップＳ８６）。
【０１５２】
ここまでの処理は，Ｙにおける丸めの方向を反対方向に変更した，もう１つのパターンの丸め結果Ｙ’を求める処理である。
【０１５３】
丸め方向判定部１７は，誤差Ｄ’を，Ｙ’−Ｓの演算で求める（ステップＳ８７）。丸め方向判定部１７は，｜Ｄ｜＝｜Ｄ’｜であるかを判定する（ステップＳ８８）。
【０１５４】
｜Ｄ｜＝｜Ｄ’｜でなければ（ステップＳ８８のＮＯ），丸め方向判定部１７は，｜Ｄ｜＜｜Ｄ’｜であるかを判定する（ステップＳ８９）。｜Ｄ｜＜｜Ｄ’｜であれば（ステップＳ８９のＹＥＳ），Ｙにおける丸めの方向は，指定された丸めモード“ＮＥＡＲＥＳＴ”に従った方向である。このとき，数値丸め部１０は，Ｙの補正を行わずに処理を終了する。｜Ｄ｜＜｜Ｄ’｜でなければ（ステップＳ８９のＮＯ），Ｙにおける丸めの方向は，指定された丸めモード“ＮＥＡＲＥＳＴ”に従った方向の反対方向である。このとき，丸め結果補正部１８は，Ｙを補正する。丸め結果補正部１８は，ＹをＹ’で更新する補正を行う（ステップＳ８１０）。
【０１５５】
｜Ｄ｜＝｜Ｄ’｜であれば（ステップＳ８８のＹＥＳ），丸め方向判定部１７は，Ｙの浮動小数点数の最下位ビットが０であるかを判定する（ステップＳ８１１）。Ｙの浮動小数点数の最下位ビットが０であれば（ステップＳ８１１のＹＥＳ），Ｙにおける丸めの方向は，指定された丸めモード“ＮＥＡＲＥＳＴ”に従った方向である。このとき，数値丸め部１０は，Ｙの補正を行わずに処理を終了する。Ｙの浮動小数点数の最下位ビットが０でなければ（ステップＳ８１１のＮＯ），Ｙにおける丸めの方向は，指定された丸めモード“ＮＥＡＲＥＳＴ”に従った方向の反対方向である。このとき，丸め結果補正部１８は，Ｙを補正する。丸め結果補正部１８は，ＹをＹ’で更新する補正を行う（ステップＳ８１２）。
【０１５６】
図１４は，本実施の形態の丸め方向判定部および丸め結果補正部による丸めモードＣＯＭＰＡＴＩＢＬＥ処理フローチャートである。
【０１５７】
図１４に示す丸めモードＣＯＭＰＡＴＩＢＬＥ処理におけるステップＳ９０〜ステップＳ９１０の処理は，基本的に図１３に示す丸めモードＮＥＡＲＥＳＴ処理におけるステップＳ８０〜ステップＳ８１０の処理と同じである。ここでは，図１４に示す丸めモードＣＯＭＰＡＴＩＢＬＥ処理におけるステップＳ９０〜ステップＳ９１０の処理の説明を省略し，ステップＳ９１１，ステップＳ９１２の処理のみ説明する。
【０１５８】
｜Ｄ｜＝｜Ｄ’｜であれば（ステップＳ９８のＹＥＳ），丸め方向判定部１７は，｜Ｙ｜＞｜Ｙ’｜であるかを判定する（ステップＳ９１１）。｜Ｙ｜＞｜Ｙ’｜であれば（ステップＳ９１１のＹＥＳ），Ｙにおける丸めの方向は，指定された丸めモード“ＣＯＭＰＡＴＩＢＬＥ”に従った方向である。このとき，数値丸め部１０は，Ｙの補正を行わずに処理を終了する。｜Ｙ｜＞｜Ｙ’｜でなければ（ステップＳ９１１のＮＯ），Ｙにおける丸めの方向は，指定された丸めモード“ＣＯＭＰＡＴＩＢＬＥ”に従った方向の反対方向である。このとき，丸め結果補正部１８は，Ｙを補正する。丸め結果補正部１８は，ＹをＹ’で更新する補正を行う（ステップＳ９１２）。
【０１５９】
以下，本実施の形態の数値丸め部１０による基数変換の具体的な例を示す。ここでは，ファイルから入力された１０進値の「123.456789」を，２進値の変数ｒに保持する例を説明する。なお，変数ｒには，４バイトの浮動小数点数で表された２進値が保持されるものとする。
【０１６０】
数値丸め部１０において，第２精度基数変換部１１は，変換対象数値「123.456789」を，指定された４バイトの精度より高い８バイトの精度で基数変換した値Ｓを求める。８バイトの浮動小数点数であるＳは，例えば，Ｓ＝01000000 0101 ……というような数値となる。このＳを，１０進表記すると「123.4567890000…」と表されるような数値となる。このＳは，有効桁数の範囲で，ほぼ入力された値に等しいとみなせる。
【０１６１】
第１精度基数変換部１３は，ハードウェア命令により，８バイトの浮動小数点数であるＳを，４バイトの浮動小数点数であるＹに丸める。このとき，Ｙは，例えば，
Ｙ＝01000010 11110110 11101001 11100000 
となる。このＹの浮動小数点数において，左側から順に，１ビットが符号部であり，続く８ビットが指数部であり，残りの２３ビットが仮数部である。参考のために，この２進値のＹを１０進表記すると，「123.456787」となる。
【０１６２】
誤差算出部１５は，ＹとＳとの誤差Ｄを算出する。誤差Ｄは，１０進表記で，
Ｄ＝−0.000002
となる。
【０１６３】
丸め方向判定部１７，丸め結果補正部１８は，指定された丸めモードに応じた処理を行う。
【０１６４】
＜丸めモードが“ＵＰ”の場合＞
丸めモードが“ＵＰ”の場合，例えば図１０に示すフローチャートに従った処理が行われる。誤差Ｄの符号が負であるため，図１０に示すフローチャートに従って，Ｙの補正が必要となる。Ｙの符号は正であるので，丸め結果補正部１８は，図１０に示すフローチャートに従って，浮動小数点数のＹをインクリメントする補正を行う。補正で得られる
Ｙ＝01000010 11110110 11101001 11100001 
が，基数変換において指定された丸めモード“ＵＰ”で丸めが行われた結果として，変数ｒに保持される。この２進値のＹを１０進表記すると，「123.456795」となる。
【０１６５】
＜丸めモードが“ＤＯＷＮ”の場合＞
丸めモードが“ＤＯＷＮ”の場合，例えば図１１に示すフローチャートに従った処理が行われる。誤差Ｄの符号が負であるため，図１１に示すフローチャートに従って，Ｙの補正は不要となる。第１精度基数変換部１３で得られた
Ｙ＝01000010 11110110 11101001 11100000 
が，基数変換において指定された丸めモード“ＤＯＷＮ”で丸めが行われた結果として，変数ｒに保持される。この２進値のＹを１０進表記すると，「123.456787」となる。
【０１６６】
＜丸めモードが“ＺＥＲＯ”の場合＞
丸めモードが“ＺＥＲＯ”の場合，例えば図１２に示すフローチャートに従った処理が行われる。誤差Ｄの符号がＹの符号と異なるため，図１２に示すフローチャートに従って，Ｙの補正は不要となる。第１精度基数変換部１３で得られた
Ｙ＝01000010 11110110 11101001 11100000 
が，基数変換において指定された丸めモード“ＺＥＲＯ”で丸めが行われた結果として，変数ｒに保持される。この２進値のＹを１０進表記すると，「123.456787」となる。
【０１６７】
＜丸めモードが“ＮＥＡＲＥＳＴ”または“ＣＯＭＰＡＴＩＢＬＥ”の場合＞
丸めモードが“ＮＥＡＲＥＳＴ”の場合，例えば図１３に示すフローチャートに従った処理が行われる。また，丸めモードが“ＣＯＭＰＡＴＩＢＬＥ”の場合，例えば図１４に示すフローチャートに従った処理が行われる。
【０１６８】
丸めモードが“ＮＥＡＲＥＳＴ”または“ＣＯＭＰＡＴＩＢＬＥ”の場合，丸め方向判定部１７は，図１３または図１４のフローチャートに従って，まず，Ｙの丸めの方向と反対方向に丸めた結果Ｙ’を求める。誤差Ｄの符号が負であり，Ｙの符号が正であるので，浮動小数点数のＹをインクリメントし，
Ｙ’＝01000010 11110110 11101001 11100001 
を得る。この２進値のＹ’を１０進表記すると，「123.456795」となる。
【０１６９】
次に，丸め方向判定部１７は，図１３または図１４のフローチャートに従って，Ｙ’とＳとの誤差Ｄ’を算出する。誤差Ｄ’は，１０進表記で，
Ｄ＝0.000006
となる。
【０１７０】
丸め方向判定部１７は，図１３または図１４のフローチャートに従って，｜Ｄ｜と｜Ｄ’｜とを比較する。
【０１７１】
｜Ｄ｜＝ 0.000002   ＜  ｜Ｄ′｜＝ 0.000006 
となるので，図１３または図１４のフローチャートに従って，Ｙの補正は不要となる。第１精度基数変換部１３で得られた
Ｙ＝01000010 11110110 11101001 11100000 
が，基数変換において指定された丸めモード“ＮＥＡＲＥＳＴ”または“ＣＯＭＰＡＴＩＢＬＥ”で丸めが行われた結果として，変数ｒに保持される。この２進値のＹを１０進表記すると，「123.456787」となる。
【０１７２】
以上説明した本実施の形態の数値丸め部１０によって，ハードウェアのアーキテクチャに依らずに，指定された丸めモードに従った丸めの結果を得ることが可能となる。例えば，浮動小数点レジスタの設定変更を行わなくても，指定された丸めモードに従った丸めの結果を得ることが可能となる。また，ハードウェアがサポートしていない丸めモードに従った丸めの結果を得ることも可能となる。
【０１７３】
また，本実施の形態の数値丸め部１０では，浮動小数点レジスタで設定されている丸めモードを変更しないので，同一スレッドで行われる別の処理に対する影響がない。また，複数のファイルに対して読み書きを行うプログラムの場合に，ファイル単位に丸めモードを指定してそれぞれのファイルへの読み書きが繰り返されても，丸めモードを変更するレジスタの読み書きが発生しないので，性能低下しない。
【０１７４】
以上，本実施の形態について説明したが，本発明はその主旨の範囲において種々の変形が可能であることは当然である。
【０１７５】
例えば，本実施の形態では，丸めモードを指定する命令を含むソースプログラムとして，Ｆｏｒｔｒａｎで記述されたソースプログラムの例について説明したが，本実施の形態の技術は，Ｃ言語やＪａｖａ（商標）などの他の言語で記述されたソースプログラムにも適用可能である。
【符号の説明】
【０１７６】
１０  数値丸め部
１１  第２精度基数変換部
１２  第２精度結果記憶部
１３  第１精度基数変換部
１４  第１精度結果記憶部
１５  誤差算出部
１６  誤差記憶部
１７  丸め方向判定部
１８  丸め結果補正部
２０  言語処理装置
２１  コンパイル部
２２  丸めモード指定命令解析部
２３  ライブラリ呼出し命令生成部
２４  リンカ部
３０  ライブラリ記憶部
３１  ファイルオープン処理部
３２  ファイル読み込み処理部
３３  入力データ解析処理部
３４  入力値設定処理部
４０  ソースプログラム
４１  オブジェクトプログラム
４２  実行形式プログラム
４３  入力処理
【図１】
0005668557.tif 000002
【図２】
0005668557.tif 000003
【図３】
0005668557.tif 000004
【図４】
0005668557.tif 000005
【図５】
0005668557.tif 000006
【図６】
0005668557.tif 000007
【図７】
0005668557.tif 000008
【図８】
0005668557.tif 000009
【図９】
0005668557.tif 000010
【図１０】
0005668557.tif 000011
【図１１】
0005668557.tif 000012
【図１２】
0005668557.tif 000013
【図１３】
0005668557.tif 000014
【図１４】
0005668557.tif 000015