2016-07-16 10 views
1

2013年に大きな作業コードを倍精度から4倍精度に変換する問題がありました。 "Converting a working code from double-precision to quadruple-precision: How to read quadruple-precision numbers in FORTRAN from an input file"です。合意は、「作業精度」を指定する可変パラメータ「WP」を使用して変数を宣言することでした。 D + 01を使用して宣言された変数とQ + 01を使用する別のバージョンのプログラムの別のバージョン。こうすることで、WP = real128またはWP = real64を一番上に定義することで簡単に前後に切り替えることができ、残りの部分を変更する必要はありません。数値の精度を調整可能なパラメータにする方法を教えてください。

しかし、どうすればいいですか?

私は、簡単なコードTEST.F90を作ることによって、その質問への答えで提案を試してみました:

PROGRAM TEST 
    use ISO_FORTRAN_ENV 
    WP= real128 
    IMPLICIT NONE 
    real (WP) :: X 
    X= 5.4857990945E-4_WP 
    END PROGRAM TEST 

はしてコンパイル:

~/gcc-4.6/bin/gfortran -o tst.x TEST.F90 

しかし、それは与える:

 IMPLICIT NONE 
        1 
Error: Unexpected IMPLICIT NONE statement at (1) 
QLEVEL16.F90:5.12: 

     real (WP) :: MEL 
      1 
Error: Parameter 'wp' at (1) has not been declared or is a variable, which does not reduce to a constant expression 
QLEVEL16.F90:6.29: 

     MEL= 5.4857990945E-4_WP 
          1 
Error: Missing kind-parameter at (1) 

答えて

4

種別指定子は整数パラメータでなければならず、適切に宣言しません。さらに、implicit noneは宣言の前に行かなければなりません。このWPのアプローチを使用して

PROGRAM TEST 
    use ISO_FORTRAN_ENV 
    IMPLICIT NONE 
    integer, parameter :: WP= real128 
    real (WP) :: X 

    X= 5.4857990945E-4_WP 
END PROGRAM TEST 
+0

優秀!他のスレッドの答えは、WP = real128がISO_FORTRAN_ENVを使用した直後で、「整数、パラメータ::」の部分を表示していないように見えるようにしました。それが私の問題の原因でした。ありがとうございました! – user1271772

+3

'use、intrinsic :: iso_fortran_env、wp => real128'を使うのはおそらくもっと魅力的でしょうか? – francescalus

+0

ありがとう@francescalus。 2つの選択肢のメリットとデメリットは何ですか? – user1271772

0

実際に多くのコード:ここで

は、両方の問題に対処する作業バージョンです。 select _ * _ kind固有の組み込み関数を持つものが多数あります。しかし、私は、「より簡単な」方法があると思います。これは、デフォルトの精度を使用するために、どのような種類のキーワードも指定せず、コンパイラのフラグを使用してデフォルトの精度を選択します。

Proは、各変数の精度を正確に制御する必要がない場合は、この方法が簡単です。 Conは、コンパイラフラグに大きく依存します。コンパイラフラグは、各コンパイラによって異なります。また、使用できない場合もあります。

gfortranには、明示的に指定された各低精度変数をより高い精度に昇格させるために、より多くのフラグ-freal4-real8または-freal4-real16があります。

+0

これは実際に私が考える好ましいアプローチです。しかし、私はそれを行う方法を知らない。 – user1271772

関連する問題