(57)【特許請求の範囲】
【請求項１】
ＦＯＲＴＲＡＮ言語によって記述されたソースコードを変換する処理をコンピュータに実行させるソースコード変換プログラムであって、前記コンピュータに、
前記ソースコードを記憶装置から読み出すステップ、
前記ソースコードのうち浮動小数点数値と他の数値とを比較する条件文を記述している個所を特定する条件文特定ステップ、
前記条件文を、前記条件文が指定する比較演算にしたがって前記浮動小数点数値と前記他の数値を比較した結果を戻す比較関数に置き換える置換ステップ、
を実行させ、
前記比較関数は、前記条件文が指定する比較演算にしたがって、前記浮動小数点数値の有効桁数に応じて定められた許容誤差と、前記浮動小数点数値と前記他の数値との間の差分とを比較した結果を戻すように構成されており、
前記ソースコード変換プログラムはさらに、前記コンピュータに、
前記浮動小数点数値の仮数部を表すビット桁数から前記浮動小数点数値の指数部が格納している数値を減算したビット桁数からさらに１ビット差し引いたビット桁数によって表現することができる最小値以上の数値を求めるステップを実行させ、
前記比較関数はさらに、前記求めた最小値以上の数値を前記許容誤差として用いるように構成されており、
前記ソースコードは、第１コンピュータ上における前記浮動小数点数値のビット桁数に準拠するように記述されており、
前記ソースコード変換プログラムは、前記コンピュータに前記ソースコードを変換させることにより、変換後の前記ソースコードを前記第１コンピュータとは異なる第２コンピュータ上における前記浮動小数点数値のビット桁数に準拠させるように構成されている
ことを特徴とするソースコード変換プログラム。
【請求項２】
前記比較関数は、前記浮動小数点数値の仮数部を表すビット桁数から前記浮動小数点数値の指数部が格納している数値を減算したビット桁数からさらに１ビット差し引いたビット桁数以下のビット桁数によって表現することができる数値を、前記許容誤差として用いるように構成されている
ことを特徴とする請求項１記載のソースコード変換プログラム。
【請求項３】
前記置換ステップにおいては、前記コンピュータに、
前記浮動小数点数値と前記他の数値が等しいか否かを判定する前記比較演算を前記条件文が指定している場合は、前記条件文を、前記差分の絶対値が前記許容誤差よりも小さいか否かの判定結果を戻すように構成された前記比較関数に置き換えさせ、
前記浮動小数点数値が前記他の数値よりも大きいか否かを判定する前記比較演算を前記条件文が指定している場合は、前記条件文を、前記浮動小数点数値から前記他の数値を差し引いて得られる前記差分が前記許容誤差よりも大きいか否かの判定結果を戻すように構成された前記比較関数に置き換えさせ、
前記浮動小数点数値が前記他の数値よりも小さいか否かを判定する前記比較演算を前記条件文が指定している場合は、前記条件文を、前記他の数値から前記浮動小数点数値を差し引いて得られる前記差分が前記許容誤差よりも大きいか否かの判定結果を戻すように構成された前記比較関数に置き換えさせる
ことを特徴とする請求項１または２記載のソースコード変換プログラム。
【請求項４】
前記置換ステップにおいては、前記コンピュータに、
前記浮動小数点数値が負値、ゼロ、または正値のいずれであるかを判定する前記比較演算を前記条件文が指定している場合は、前記条件文を、
前記浮動小数点数値の絶対値が前記許容誤差よりも小さい場合は前記浮動小数点数値がゼロである旨の判定結果を戻し、前記浮動小数点数値が前記許容誤差よりも大きい場合は前記浮動小数点数値が正値である旨の判定結果を戻し、前記浮動小数点数値が前記許容誤差の符号反転値よりも小さい場合は前記浮動小数点数値が負値である旨の判定結果を戻すように構成された前記比較関数に置き換えさせる
ことを特徴とする請求項１から３のいずれか１項記載のソースコード変換プログラム。
【請求項５】
前記ソースコード変換プログラムは、前記コンピュータにさらに、
前記許容誤差を指定する指定値を取得するステップを実行させ、
前記置換ステップにおいては、前記コンピュータに、
前記条件文を、前記許容誤差として前記指定値を用いる前記比較関数に置き換えさせる
ことを特徴とする請求項１から４のいずれか１項記載のソースコード変換プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＦＯＲＴＲＡＮ言語によって記述されたソースコードを変換する技術に関する。
【背景技術】
【０００２】
プログラム言語によっては、浮動小数点型変数の精度を単精度と倍精度のいずれかに指定することができるものがある。単精度演算と倍精度演算は演算精度が異なるので、これら変数が混在する場合、演算精度を適切に保つための工夫が必要である。
【０００３】
下記特許文献１は、演算オーバーヘッドを回避しつつ単精度演算と倍精度演算の精度を効率的に保証するための技術を開示している。同文献においては、課題解決手段として、『コンピュータに搭載されたコンパイラ１００において、浮動小数点演算における倍精度モードでメソッドのオブジェクトコードを生成すると共に、このメソッドが単精度モードで頻繁に呼び出され、かつ単精度モードで実行することにより処理コストを削減できる場合に、単精度モードでメソッドの第２のコードを生成する。あるいは、コンパイルしようとする対象メソッドが浮動小数点演算における倍精度モードと単精度モードのどちらから呼ばれるかに関わらず、この対象メソッド内の演算の種類に応じて演算精度を設定してオブジェクトコードを生成し、対象コードとこの対象コードを呼び出す他のコードまたはこの対象コードに呼び出される他のコードとの関係に基づいて精度モードを合わせるためのコードを生成し追加する。』という手法を記載している（要約参照）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００４−０６２８３０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ＦＯＲＴＲＡＮ言語においては、２つの実数値を比較する条件文を用いる場合がある。例えば「ＥＱ（＝）」「ＮＥ（≠）」「ＬＴ（＜）」「ＧＴ（＞）」などの条件文がこれに相当する。これら条件文において、浮動小数点実数値を比較対象とする場合、例えば数値そのものが２進数によって表現することができないことに起因して誤差が生じ、想定とは異なる比較結果が得られる場合がある。例えば、浮動小数点数値の有効桁数などに起因する計算誤差が生じる可能性もある。
【０００６】
特に同一のＦＯＲＴＲＡＮソースコードを異なるプラットフォーム上でコンパイルした場合、プラットフォーム毎に浮動小数点数値の有効桁数が異なる場合がある。そうすると同一のＦＯＲＴＲＡＮソースコードであってもプラットフォーム毎に比較結果が異なる場合があり、上記課題が顕著に現れる。
【０００７】
上記特許文献１においては、単精度と倍精度の違いに起因する演算精度の違いを効率的に克服する手法を開示しているものの、上記のように浮動小数点数値の２進近似や有効桁数に起因する誤差を解消する手法については開示していない。
【０００８】
本発明は、上記のような課題に鑑みてなされたものであり、ＦＯＲＴＲＡＮ言語によって記述されたプログラム内において浮動小数点数値を比較演算する際において、プラットフォーム毎に比較結果が異なることを抑制することを目的とする。
【課題を解決するための手段】
【０００９】
本発明に係るソースコード変換プログラムは、浮動小数点数値と他の数値とを比較する条件文を、所定の許容誤差に基づき同様の比較を実施してその結果を戻す比較関数に置き換える。
【発明の効果】
【００１０】
本発明に係るソースコード変換プログラムによれば、プラットフォーム毎の比較演算結果の違いを抑制することができる。
【図面の簡単な説明】
【００１１】
【図１】浮動小数点数値の２進近似に起因する演算誤差を実証するためのＦＯＲＴＲＡＮプログラムのソースコードである。
【図２】図１のプログラムを実行した結果を示す図である。
【図３】実施形態１に係るソースコード変換プログラム１１１を実行するコンピュータ１００およびその周辺構成を示す図である。
【図４】図１〜図２で説明した比較演算誤差を抑制するため実施することが望ましい処理について説明する図である。
【図５】ソースコード変換プログラム１１１が変換を実施した後のソースコード２００を示す図である。
【図６】関数ＮＣＫＲの定義を説明する図である。
【図７】許容誤差が有効に機能するか否かを、比較対象とする浮動小数点数値の小数点以下桁数毎に検討した結果を示す図である。
【図８】浮動小数点数値を表現するためのビット構成を示す図である。
【図９】ソースコード２００内における算術ＩＦ文の例である。
【図１０】関数ＮＣＩＦの定義を説明する図である。
【図１１】実施形態３におけるコンピュータ１００およびその周辺構成を示す図である。
【図１２】関数ＮＣＫＲＥの定義を説明する図である。
【図１３】関数ＮＣＩＦＥの定義を説明する図である。
【発明を実施するための形態】
【００１２】
＜従来技術における課題＞
以下では本発明の理解を容易にするため、まず従来技術における課題についてその具体例を説明し、その後に本発明の実施形態について説明する。
【００１３】
図１は、浮動小数点数値の２進近似に起因する演算誤差を実証するためのＦＯＲＴＲＡＮプログラムのソースコードである。同プログラムは、変数Ａを０．０から１．０５まで０．０５ずつ増加させ、変数Ａと変数Ｂ＝０．９とを比較した結果を画面出力する。比較結果を画面出力する処理については図１右側に示すサブルーチン内に記述している。ここでは記載の簡易のため、両変数が等しい場合に実施するサブルーチンＥＱのみ示したが、その他のサブルーチンＧＴとＬＴも類似の処理を実施する。
【００１４】
図２は、図１のプログラムを実行した結果を示す図である。図２の１行目は、変数Ａの増分幅である０．０５と変数Ｂ＝０．９をそれぞれ示している。これらはともに２進数によって表すことができない数値であるため、２進近似誤差が生じていることが分かる。
【００１５】
さらに図２において、比較演算の結果についても誤差が生じている。図２の太線枠で囲んでいる比較結果は、変数Ａ＝０．９と変数Ｂ＝０．９を比較しているため、本来であれば比較結果は「ＧＴ」ではなく「ＥＱ」となるはずである。しかし上述の２進近似誤差に起因して、プログラムが期待したものとは異なる比較結果となっている。
【００１６】
上記のような比較演算における誤差は、ソースコードを異なるプラットフォームへ移行したときに生じる可能性がある。例えば図１のソースコードを現行プラットフォーム（旧版メインフレーム）から新プラットフォーム（オープン系システム）へ移行した場合を考える。現行プラットフォームにおいては単精度浮動小数点数値をそのまま単精度として処理している場合、図２に示すような比較演算誤差は生じない。これに対し、新プラットフォームにおいては、演算精度を上げるため、単精度変数であっても内部的には倍精度数値を保持している場合がある。その結果、比較演算に関しては、図２に示すように却って想定とは異なる結果が得られてしまう。
【００１７】
本発明においては、上述のようにプラットフォーム移行時において発生する可能性がある比較演算の誤差を解消するため、ＦＯＲＴＲＡＮソースコードのうち比較演算を記述している条件文を特定し、これを所定の比較関数と置き換える。以下、その具体的な実施形態について説明する。
【００１８】
＜実施の形態１：ソースコード変換＞
図３は、本発明の実施形態１に係るソースコード変換プログラム１１１を実行するコンピュータ１００およびその周辺構成を示す図である。コンピュータ１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１１０、記憶部１２０を備える。ＣＰＵ１１０は、ソースコード変換プログラム１１１、コンパイラ１１２を実行する。記憶部１２０は例えばハードディスク装置などの記憶装置であり、オブジェクトコード１２１を格納する。ソースコード変換プログラム１１１とコンパイラ１１２は、記憶部１２０を含む適当な記憶装置内に格納することができる。
【００１９】
以下では記載の便宜上、各プログラムを動作主体として説明する場合があるが、実際にこれらプログラムを実行するのはＣＰＵ１１０であることを付言しておく。
【００２０】
コンパイラ１１２は、例えば記憶部１２０またはコンピュータ１００以外の計算機（メインフレームなど）上の記憶装置が格納している、ＦＯＲＴＲＡＮ言語によって記述されたソースコード２００を、コンパイルしてオブジェクトコード１２１に変換し、これを記憶部１２０に格納する。
【００２１】
ソースコード変換プログラム１１１は、コンパイラ１１２がソースコード２００をコンパイルする前に、以下に説明する処理により条件文部分を変換する。ソースコード変換プログラム１１１は、プリコンパイラのようにコンパイラ１１２と連動して動作するプログラムとして構成することもできるし、コンパイラ１１２とは切り離されたプログラムとして構成し、コンパイルを開始する前に例えばユーザが手動操作でソースコード変換プログラム１１１を起動して変換を実施してもよい。
【００２２】
図４は、図１〜図２で説明した比較演算誤差を抑制するため実施することが望ましい処理について説明する図である。図４（ａ）は図１のソースコードの一部抜粋を示す。図４（ｂ）は、比較演算誤差を抑制するため実施すべきであると考えられる、図４（ａ）に対応する処理を示す。
【００２３】
図４（ａ）に示すように、浮動小数点数値を単純比較すると、図２で説明したような比較演算誤差が生じる。この比較演算誤差によって予期しない結果が生じないようにするためには、比較演算誤差があらかじめ設定した許容誤差ＥＰＳの範囲内であればその比較演算誤差は生じなかったものとみなすことが望ましいと考えられる。具体的には、以下のような処理を実施することが考えられる。
【００２４】
（処理例１：比較演算ＥＱに対応する処理）
変数Ａと変数Ｂとの間の差分の絶対値を許容誤差ＥＰＳと比較し、同絶対値が許容誤差ＥＰＳよりも小さければ、変数Ａと変数Ｂは等しいとみなす。
【００２５】
（処理例２：比較演算ＮＥに対応する処理）
変数Ａと変数Ｂとの間の差分の絶対値を許容誤差ＥＰＳと比較し、同絶対値が許容誤差ＥＰＳよりも大きければ、変数Ａと変数Ｂは等しくないとみなす。
【００２６】
（処理例３：比較演算ＧＴに対応する処理）
変数Ａから変数Ｂを減算して得られる両者間の差分を許容誤差ＥＰＳと比較し、同差分が許容誤差ＥＰＳよりも大きければ、変数Ａは変数Ｂよりも大きいとみなす。
【００２７】
（処理例４：比較演算ＬＴに対応する処理）
変数Ａから変数Ｂを減算して得られる両者間の差分を許容誤差ＥＰＳの符号反転値と比較し、同差分が許容誤差ＥＰＳの符号反転値よりも小さければ、変数Ａは変数Ｂよりも小さいとみなす。
【００２８】
（処理例５：比較演算ＧＥまたはＬＥ）
比較演算ＧＥ（≧）またはＬＥ（≦）は、それぞれＧＴとＥＱの組み合わせ、またはＬＴとＥＱの組み合わせによって実現できるので、上記各処理例と同様に処理すればよい。
【００２９】
図５は、ソースコード変換プログラム１１１が変換を実施した後のソースコード２００を示す図である。図１において比較演算を記述していた３つの条件文は、図５においてＮＣＫＲという関数に置き換えられている。関数ＮＣＫＲは、図４（ｂ）で説明した処理を実装した関数である。ソースコード変換プログラム１１１は、ソースコード２００内の比較演算を記述している条件文を、図５に示す関数ＮＣＫＲに置き換えることにより、図４（ｂ）と等価な処理を実施して比較演算誤差の影響を抑制することを図る。
【００３０】
関数ＮＣＫＲのソースコードは、ソースコード変換プログラム１１１が内部的に保持している。ソースコード変換プログラム１１１は、上記変換を実施した後のソースコード２００をコンパイラ１１２に対して引き渡す際に、関数ＮＣＫＲのソースコードをソースコード２００に付加する。
【００３１】
図６は、関数ＮＣＫＲの定義を説明する図である。関数ＮＣＫＲは、上記処理例１〜５で説明した５つの比較演算子を引数＊ＣＯＮＤに指定し、比較する２つの浮動小数点数値をそれぞれ引数＊ｒｅａｌａｐと＊ｒｅａｌｂｐに指定する。
【００３２】
引数＊ｒｅａｌａｐと＊ｒｅａｌｂｐのうちいずれかが浮動小数点数値でない場合、ソースコード変換プログラム１１１は、浮動小数点数値でないほうの引数を、例えばＦＯＲＴＲＡＮ言語のＲＥＡＬ（）関数などによって浮動小数点数値に変換した上で、関数ＮＣＫＲへ引き渡すようにしてもよい。これにより、全ての条件文を統一的に処理することができる。
【００３３】
以上、ソースコード変換プログラム１１１が実施する変換処理について説明した。次に許容誤差ＥＰＳの適切な値について、以下に検討する。
【００３４】
＜実施の形態１：許容誤差＞
単精度浮動小数点を用いる場合、仮数部によって表現できるのは、１０進数における約７桁に相当する。図１〜図２で説明した増分幅と変数Ｂは、仮数部７桁の範囲内においてはいずれも指定した値そのもの（またはこれとほぼ等しい）であるため、これらを単精度変数として取り扱う場合は上述の比較演算誤差は生じないと考えられる。
【００３５】
他方、プラットフォームによっては、演算精度を上げるため、単精度浮動小数点数値であっても内部的にはそれ以上の桁数まで数値を保持している場合がある。この場合、例えば図２の１行目で示したような数値が内部的に保持されている。これは通常の演算であれば演算精度を向上させることができると考えられる反面、浮動小数点数値同士を比較する際には、図２で説明したように比較演算誤差を却って招いてしまう可能性がある。
【００３６】
すなわち、浮動小数点数値がどの程度の精度で数値を保持しているかはプラットフォームによって異なる場合があるので、許容誤差ＥＰＳとして適切な数値は、当該プラットフォームにおける浮動小数点数値の精度に応じて定めることが望ましいと考えられる。さらには、浮動小数点数値そのものの値に応じて、許容誤差ＥＰＳとして適切な数値も異なると考えられる。以下にその具体例について説明する。
【００３７】
図７は、許容誤差ＥＰＳを０．０１とした場合において、その許容誤差が有効に機能するか否かを、比較対象とする浮動小数点数値の小数点以下桁数毎に検討した結果を示す図である。上記検討の通り、許容誤差ＥＰＳは浮動小数点数値の精度に応じて定めることが望ましい。そこで図７において、有効桁数が１０進数で７桁である場合について、６つの数値パターンについて許容誤差ＥＰＳが有効に機能するか否かを検討した。図７に示すように、浮動小数点数値の有効桁数および許容誤差ＥＰＳが同じであったとしても、小数点以下の桁数が異なると、その許容誤差が有効に機能するか否かも異なる。
【００３８】
以上の検討によれば、許容誤差ＥＰＳは、当該プラットフォームにおける浮動小数点数値の精度および浮動小数点数の値に応じて定めることが望ましいと考えられる。そこで本実施形態１においては、当該プラットフォーム上で浮動小数点数値が表現することができる、小数点以下の最小値（またはこれに多少のマージンを持たせた値）を、許容誤差ＥＰＳとして採用することにした。以下にその具体的な計算手順を説明する。
【００３９】
図８は、浮動小数点数値を表現するためのビット構成を示す図である。図８に示す例においては、当該プラットフォームは浮動小数点数値を、（ａ）符号部１ビット、（ｂ）指数部８ビット、（ｃ）仮数部２４−１＝２３ビットによって表現するものと仮定した。
【００４０】
例えば１０進数の浮動小数点数値（１２．３７５）１０は、２進数表現においては（１１００．０１１）２と表現される。浮動小数点数値の２進数表現は、コンピュータ内部においては（１．ｂ１ｂ２ｂ３・・・）２×２ｅ（ｂは仮数部の各ビット、ｅは指数部が格納する値）という形式で表現する必要があるので、上記２進数表現をこれにしたがって表現すると、（１．１０００１１）２×２３となる。この数値を図８に示すデータ形式にしたがってビット列により格納すると、仮数部がビット列（１１０００１１）を格納し、指数部が３を格納することになる。
【００４１】
本来の２進数表現である（１１００．０１１）２を、上記表現形式における（１．１０００１１）２と比較すると、以下のことが分かる。すなわち、仮数部の２４−１＝２３ビットが格納しているビット列のうち、本来の２進数表現における小数点以下の部分に相当する（．０１１）として用いることができる桁数は、指数部の値が表す次数（ここでは３）だけシフトして減少することになる。具体的には、本来の２進数表現においては小数点以下の部分は２進３桁（．０１１）であったところ、上記表現型式においては小数点以下の部分は２進６桁（．１０００１１）になっているので、シフトした２進３桁の分だけ、小数点以下の有効桁数が減少することになる。
【００４２】
そうすると、上記表現型式によって表現することができる小数点以下部分の有効ビット桁数は、２４−１−（指数部が格納している値）＝２４−１−３＝２０ビットということになる。換言すると、上記表現型式により、最小で２−２０に相当する小数点以下の数値を表現することができる。なおここでいう最小とは、正値のなかで最小という意味であり、０および負値は除く。
【００４３】
上記前提の下、許容誤差ＥＰＳとして採用すべき値について検討する。図１〜図２で説明した例のように、表現することができる数値があまりにも小さい場合、２つの浮動小数点数値を比較すると想定外の動作が生じる可能性がある。そこで、許容誤差ＥＰＳとしては、上記表現形式により表現することができる最小値よりも若干大きい数値とすることが望ましいと考えられる。例えば上記例において、許容誤差ＥＰＳとして２−２０よりも若干大きい値（例えば２−１９、２−１８など）を採用した場合、ＥＰＳよりも小さい誤差は無視されるため、図２の太枠線で囲んだ部分はＡ＝Ｂと判定されることになる。
【００４４】
以上の検討によれば、許容誤差ＥＰＳとしては、浮動小数点数値の小数点以下部分が表現することができる最小数値以上（演算対象の性質によっては最小数値そのものを採用することもあり得る）の数値を採用することが望ましいと考えられる。具体的には、浮動小数点数値の（仮数部ビット桁数）−１−（指数部が格納している値）によって求められるビット桁数によって表現することができる最小値以上の数値を、ＥＰＳとして採用する。簡易的には、上記計算式によって求められるビット桁数以下のビット桁数によって表現することができる数値をＥＰＳとすればよい。例えば上記数値例においては、ＥＰＳ＝２−２０、２−１９、２−１８などとすればよい。
【００４５】
許容誤差ＥＰＳは比較対象とする浮動小数点数値の仮数部ビット桁数および指数部が格納している値によって異なるので、例えば関数ＮＣＫＲ内部または関数ＮＣＫＲから別途呼び出す内部関数によって都度計算する。関数ＮＣＫＲはそのＥＰＳを用いて、図４（ｂ）で説明した比較演算を実施する。
【００４６】
＜実施の形態１：まとめ＞
以上のように、本実施形態１に係るソースコード変換プログラム１１１は、ＦＯＲＴＲＡＮソースコードのうち浮動小数点数値Ａと他の数値Ｂとを比較する条件文を、関数ＮＣＫＲに置き換える。関数ＮＣＫＲは、図４で説明した処理にしたがって、ＡとＢとの間の差分を許容誤差ＥＰＳと比較し、その結果を戻す。これにより、許容誤差ＥＰＳの範囲内における誤差は無視されるので、プラットフォームによって浮動小数点数値の有効桁数が異なる場合であっても、許容誤差ＥＰＳの範囲内においてその誤差を吸収することができる。すなわち、プラットフォーム毎に浮動小数点数値の有効桁数が異なる場合であっても同一の演算結果を提供することができる。
【００４７】
また本実施形態１に係るソースコード変換プログラム１１１は、浮動小数点数値の（仮数部ビット桁数）−１−（指数部が格納している値）のビット桁数によって表現することができる最小数値以上の数値を、許容誤差ＥＰＳとして採用する。これにより、当該プラットフォームにおける浮動小数点数値の有効桁数に応じて最適な許容誤差ＥＰＳを自動的に定めることができる。さらには、浮動小数点数値の値に応じて許容誤差ＥＰＳを最適に自動調整することができる。
【００４８】
本実施形態１においては、ＦＯＲＴＲＡＮソースコードを異なるプラットフォームへ移行する際に生じる課題について例示したが、同一のプラットフォーム上でＦＯＲＴＲＡＮソースコードを動作させる場合においても、本実施形態１は有効である。例えばソースコード変換プログラム１１１を介してソースコード２００を変換することにより、単純比較を実施している条件文をＮＣＫＲに置き換えて許容誤差の範囲内で誤差を吸収することができるので、ソースコード２００を同一プラットフォーム上でリファクタリングするような効果が発揮される。
【００４９】
＜実施の形態２＞
実施形態１においては、比較演算ＥＱ、ＮＥ、ＧＴ、ＬＴ（ＧＥとＬＥを含む）に対応する関数ＮＣＫＲについて説明した。ＦＯＲＴＲＡＮ言語におけるその他の比較演算として、指定した変数がマイナス／ゼロ／プラスのいずれであるかに応じて処理を分岐する算術ＩＦ文がある。本発明の実施形態２では、算術ＩＦ文を置き換える関数ＮＣＩＦについて説明する。各プログラムなどの構成は実施形態１と同様である。
【００５０】
図９は、ソースコード２００内における算術ＩＦ文の例である。図９（ａ）はソースコード変換プログラム１１１が変換する前のソースコード２００を示し、図９（ｂ）は変換後の同部分を示す。
【００５１】
変換前における算術ＩＦ文は、変数ＲＶＡＬが負値であればステップ１０へスキップし、ゼロであればステップ２０へスキップし、正値であればステップ３０へスキップするよう指定している。この算術ＩＦ文は、変数ＲＶＡＬと数値０を比較するものであるため、図１〜図２で説明したものと同様の誤差に起因する不具合が生じる可能性がある。そこで本実施形態２において、ソースコード変換プログラム１１１は、この算術ＩＦ文を関数ＮＣＩＦに置き換える。
【００５２】
図１０は、関数ＮＣＩＦの定義を説明する図である。関数ＮＣＩＦは、マイナス／ゼロ／プラスのいずれであるかを判定する対象である浮動小数点数値を、引数＊ｒｅａｌｖａｌｐとして指定する。関数ＮＣＩＦの戻り値は、引数＊ｒｅａｌｖａｌｐのマイナス／ゼロ／プラスに応じてそれぞれ−１／０／１であるため、変換前後の算術ＩＦ文は同じ動作となる。
【００５３】
関数ＮＣＩＦは、引数＊ｒｅａｌｖａｌｐと０を比較した結果を戻す関数とみなすことができるので、実施形態１の図４で説明した関数ＮＣＫＲの処理内容において変数Ｂ＝０とすることにより、関数ＮＣＩＦの処理内容を実装することができる。具体的には、以下のように実装することができる。
【００５４】
（処理例１：引数が０であるか否かを判定する処理）
変数Ａの絶対値を許容誤差ＥＰＳと比較し、同絶対値が許容誤差ＥＰＳよりも小さければ、変数Ａは０とみなす。
【００５５】
（処理例２：引数が正値であるか否かを判定する処理）
変数Ａを許容誤差ＥＰＳと比較し、許容誤差ＥＰＳよりも大きければ、変数Ａは正値であるとみなす。
【００５６】
（処理例３：引数が負値であるか否かを判定する処理）
変数Ａを許容誤差ＥＰＳと比較し、許容誤差ＥＰＳの符号反転値よりも小さければ、変数Ａは負値であるとみなす。
【００５７】
＜実施の形態３＞
実施形態１〜２においては、許容誤差ＥＰＳをプラットフォーム仕様および浮動小数点数値に応じて自動的に求めることを説明した。一方で演算対象の性質などによっては、許容誤差ＥＰＳをマニュアル指定したい場合も考えられる。そこで本発明の実施形態３においては、許容誤差ＥＰＳを指定することができる構成例について説明する。
【００５８】
図１１は、本実施形態３におけるコンピュータ１００およびその周辺構成を示す図である。本実施形態３において、ソースコード変換プログラム１１１は、ソースコード２００の他に許容誤差指定値２１０を取得する。許容誤差指定値２１０は、許容誤差ＥＰＳを指定する値であり、例えば（ａ）オペレータが手動入力する、（ｂ）データファイルなどに許容誤差指定値２１０を記述してソースコード変換プログラム１１１がこれを読み込む、（ｃ）あらかじめソースコード変換プログラム１１１内に組み込んでおく、（ｄ）ソースコード変換プログラム１１１がネットワーク経由でサーバなどにアクセスして取得する、などの適当な手法によって指定することができる。
【００５９】
ソースコード変換プログラム１１１は、許容誤差指定値２１０を取得した場合、実施形態１〜２で説明した関数ＮＣＫＲと関数ＮＣＩＦに代えて、それぞれ関数ＮＣＫＲＥと関数ＮＣＩＦＥを用いる。これら関数について以下に説明する。
【００６０】
図１２は、関数ＮＣＫＲＥの定義を説明する図である。関数ＮＣＫＲＥは、関数ＮＣＫＲの引数に加えてさらに許容誤差ＥＰＳを指定する引数を有する。関数ＮＣＫＲＥは、引数によって指定された許容誤差をＥＰＳとして用いる。その他の処理は関数ＮＣＫＲと同じである。ソースコード変換プログラム１１１は、条件文を関数ＮＣＫＲＥに置き換える際に、許容誤差ＥＰＳを指定する引数として、許容誤差指定値２１０を指定する。
【００６１】
図１３は、関数ＮＣＩＦＥの定義を説明する図である。関数ＮＣＩＦＥは、関数ＮＣＩＦの引数に加えてさらに許容誤差ＥＰＳを指定する引数を有する。関数ＮＣＩＦＥは、引数によって指定された許容誤差をＥＰＳとして用いる。その他の処理は関数ＮＣＩＦと同じである。ソースコード変換プログラム１１１は、算術ＩＦ文を関数ＮＣＩＦＥに置き換える際に、許容誤差ＥＰＳを指定する引数として、許容誤差指定値２１０を指定する。
【００６２】
＜実施の形態４＞
以上の実施形態１〜３においては、単精度浮動小数点数値を内部的に倍精度で保持している場合において生ずる演算誤差を例として用いた。同様の演算誤差は、必ずしも単精度と倍精度の組み合わせにおいてのみ生じるものではないので、本発明は浮動小数点数値一般に対して適用することができる。
【００６３】
本発明を浮動小数点数値一般に対して適用する場合、実施形態３で説明した許容誤差ＥＰＳを指定する各関数においては、引数としてさらに浮動小数点数値のビット桁数（例えば単精度であれば４（バイト）または３２（ビット））を指定できるようにしてもよい。
【符号の説明】
【００６４】
１００：コンピュータ、１１０：ＣＰＵ、１１１：ソースコード変換プログラム、１１２：コンパイラ、１２０：記憶部、１２１：オブジェクトコード、２００：ソースコード、２１０：許容誤差指定値。
【要約】
【課題】ＦＯＲＴＲＡＮ言語によって記述されたプログラム内において浮動小数点数値を比較演算する際において、プラットフォーム毎に比較結果が異なることを抑制する。
【解決手段】本発明に係るソースコード変換プログラムは、浮動小数点数値と他の数値とを比較する条件文を、所定の許容誤差に基づき同様の比較を実施してその結果を戻す比較関数に置き換える。
【選択図】図４【図１】
0005593461.tif 000002
【図２】
0005593461.tif 000003
【図３】
0005593461.tif 000004
【図４】
0005593461.tif 000005
【図５】
0005593461.tif 000006
【図６】
0005593461.tif 000007
【図７】
0005593461.tif 000008
【図８】
0005593461.tif 000009
【図９】
0005593461.tif 000010
【図１０】
0005593461.tif 000011
【図１１】
0005593461.tif 000012
【図１２】
0005593461.tif 000013
【図１３】
0005593461.tif 000014