2.25 精度の一元化
精度の一元化は一連のFortranソース・ファイル内の浮動小数点及び複素数変数宣言、定数、いくつかの個別組込手続きの精度を一元化します。
四倍精度への一元化は四倍精度浮動小数点演算がサポートされているマシンでのみ利用可能です。
このツールはUSE文を用いてプログラム単位(及び引用仕様宣言)から精度一元化パラメタを参照できるようにします。 USE文の形式はオプションで指定可能です。-pp_name=は精度パラメタの名前が指定可能で -pp_module=オプションで親モジュール(‘精度モジュール’)の名前が指定可能です。 デフォルト(指定を行わない場合)のUSB文の形式はUSE WORKING_PRECISION, ONLY: WPとなります。
-precision=オプション(デフォルト値はDouble)は入力ソースプログラムが意図する精度を指定します。 (モジュールを生成するオプションが指定されている場合にはこの値が出力にも使われます) 本ツールはこの値に基いて入力ソースプログラムの有効性を検証します。
本ツールは精度一元化モジュールの生成が可能ですが、ツール自体が精度の一元化を行うものではありません。 本ツールはそのモジュールが既に存在している場合に警告を発します。 更にそのモジュール内で精度パラメタが指定されていない場合や -precision=の指定と異なる種別が指定されている場合にもメッセージが出力されます。
本ツールは入力ソース内の一つ一つのプログラム単位と引用仕様宣言を検索し、精度パラメタが既に参照可能であるかどうかを決定します。 参照可能でない場合、上記で指定された形式のUSE文が可能な範囲で最も後ろに挿入されます。 内部手続及びモジュール手続の場合、この文は親に対して挿入されます。 精度パラメタがINTEGER, PARAMETER :: wp = constant_expressionの形式で既に宣言されている場合、 この宣言は削除され新しい文が追加されます。 (このPARAMETER形式の文は他のすべての浮動小数点及び複素数要素の宣言より前に現れた場合のみ認識されます。) その他の定義形式もしくは精度パラメタのインポートは変更されず、標準化のUSE文が挿入できなかった旨の警告が発せられます。
浮動小数点及び複素数要素の型宣言はを精度パラメタを種別パラメタとして含むように一元化されます。 暗黙的に浮動小数点もしくは複素数の言語要素は同様な形式で明示的に宣言されます。 関数文で浮動小数点もしくは複素数型指定されている関数定義の場、この指定は削除されて別途関数結果の型宣言文が関数宣言部に挿入されます。
浮動小数点及び複素数定数表現は種別として精度パラメタを用いるように一元化されます。
以下の個別手続き参照は以下に示される総称名で標準化されています。
個別名 | 総称名 | 個別名(続き) | 総称名(続き) | 個別名(続き) | 総称名(続き) |
ALOG10 | LOG10 | DATAN | ATAN | DSINH | SINH |
ALOG | LOG | DBLE | REAL | DSIN | SIN |
AMAX0(...) | REAL(MAX(...)) | DCMPLX | CMPLX | DSQRT | SQRT |
AMAX1 | MAX | DCONJG | CONJG | DTANH | TANH |
AMIN0(...) | REAL(MIN(...)) | DCOS | COS | DTAN | TAN |
AMIN1 | MIN | DCOSH | COSH | FLOAT | REAL |
AMOD | MOD | DDIM | DIM | IABS | ABS |
CABS | ABS | DEXP | EXP | IDIM | DIM |
CCOS | COS | DIMAG | AIMAG | IDINT | INT |
CDABS | ABS | DINT | AINT | IDNINT | NINT |
CEXP | EXP | DLOG10 | LOG10 | IFIX | INT |
CLOG | LOG | DLOG | LOG | ISIGN | SIGN |
CSIN | SIN | DMAX1 | MAX | MAX0 | MAX |
CSQRT | SQRT | DMIN1 | MIN | MAX1(...) | INT(MAX(...)) |
DABS | ABS | DMOD | MOD | MIN0 | MIN |
DACOS | ACOS | DNINT | ANINT | MIN1(...) | INT(MIN(...)) |
DASIN | ASIN | DREAL | REAL | SNGL | REAL |
DATAN2 | ATAN2 | DSIGN | SIGN |
(-dcfunsについても合わせてご参照下さい)
更に、DBLEはREALに変換されます。 それに引き続きREAL及びCMPLXの呼び出し引数に必要に応じてKIND=引数が追加されます。
入力ソースの一元化を行うことで望まれない副作用をもしくは無効なFortranが生成されてしまうような場合、 本ツールは警告を発する事を試みます。以下に本ツールを使わない方が望ましい場合の例を示します。
- ソースプログラムが意図的に浮動小数点及び複素数精度の混合を行っている場合。
- Fortran言語の総称プログラミングの機能(例えば総称引用仕様宣言もしくはパラメタ化構造型)を利用している場合。
- EQUIVALENCE文もしくはTRANSFER組込み関数参照に浮動小数点もしくは複素数データが含まれる場合。
- 明示的い型宣言された組込み関数が含まれる場合もしくは組込み関数を手続き引数として渡している場合。
- DPROD組込み関数を(例えば単精度のプログラム単位内で倍精度の計算を行おうとして)使っている場合。
複数のファイルに手続きが存在する場合、これらすべてのファイルに対して一貫性を持って本ツールを適用する必要があります。 これにより一元化で、例えば手続き参照とそれに対応する手続き定義の整合性が損なわれてしまうような事を防止できます。
精度の一元化は以下のコンパイラオプションを認識します。 -132, -abi, -dcfuns, -double, -dryrun, -dusty, -encoding, -english, -f2003, -f2008, -f95, -fixed, -free, -help, -hpf, -I, -i8, -indirect, -info, -kind, -max_parameter_size, -maxcontin, -mismatch, -mismatch_all, -nihongo, -nocheck_modtime, -nomod, -noqueue, -o, -openmp, -Qpath, -r8, -strict95, -tempdir, -thread_safe, -u, -u=sharing, -v, -V, -w and -xlicinfo.
-doubleもしくは-r8オプションは-precision=に影響を与える事に注意して下さい。 詳細は以下をご参照下さい。
一元化された出力は-oオプションで指定されたファイル、 もしくはその指定がなされなかった場合は拡張子が‘.f90_prs’に変更されたファイルに書き出されます。 出力ファイル名は入力ファイル名と同じであってはなりません。
精度の一元化ツールは拡張ソース整形ツールのオプションをすべて同じ意味にて認識します。
上記以外に以下のオプションが本ツールの振る舞いを制御します。
- -nocmt_generation
- 精度モジュールを生成する場合、このモジュールが生成されたというコメントを追加しないようにします。
- -pp_create_module
- 自動的に精度モジュールを作成します。この際のファイル名ははモジュール名を小文字にして拡張子‘.f90’をつけたものとなります。
(デフォルトではworking_precision.f90となります。)
ファイルが既に存在する場合には上書きされません。
生成されたモジュールは精度パラメタの定義及び(-nocmt_generationを指定しない限りにおいて)モジュールがいつ作成されたかのコメントのみが含まれます。
- -pp_name=X
- 一元化された出力で使うため精度パラメタ名をXに設定します。 この名前は入力ソース内の名前と競合しない識別子でなければなりません。 デフォルトは‘WP’です。
- -pp_module=X
- 精度パラメタのインポートもととなる精度モジュール名を指定します。 このモジュール名は入力ソース内の名前と競合しない識別子でなければなりません。 デフォルトは‘WORKING_PRECISION’です。
- -pp_nocreate_module
- 精度モジュールを作成しません。 これがデフォルトの動作です。
- -precision=X
- 入力ソースプログラムが意図する精度を指定します。
Single(REALと同じ精度), Double(DOUBLE PRECISIONと同じ精度), Quadrupleのいずれかである必要があります。
デフォルトは-precision=Doubleです。
-double と -r8 はデフォルトのREAL(及び場合によってはDOUBLE PRECISION)の大きさを倍にします。 そのためこれらのオプションが-precision=に異なる意味をもたらす場合があることに注意して下さい。