2013-03-14 11 views
5

指数付きの単純式とそれに続く乗算を評価すると、ポートランドとインテルFortranコンパイラの動作が異なります。私はかなりpgf90(とgfortran)が演算子の優先順位の理解に基づいて正しく動作していると確信していますが、これらのことが少し難解になる可能性があるので、私は二番目の意見が欲しいです。ifortを使用した指数のFortran演算子優先順位エラー

私のコードは非常に基本的な形式に簡略化されています。 ifortを実行すると、形式d1=a**-2*bの式は、ifortによってd1=a**(-2*b)と解釈され、d1=(a**-2)*bによってpgf90とgfortranによって解釈されます。指数から負の符号を取り除くと、3つのコンパイラはすべてこれをd1=(a**2)*bと解釈します。 * bを+ bに変更すると、3つのすべてからも良い行動が得られます。

program badvals 
    implicit none 
    real :: a, b, c1, c2, d1, d2 

    a = 2. 
    b = 4. 

    ! Works with addition following the exponent. 
    c1 = a**-2+b 
    c2 = a**(-2)+b 

    ! Ifort differs with multiplication following negative exponent. 
    d1 = a**-2*b 
    d2 = a**(-2)*b 

    print*, "c1, d1  = ",c1, d1 
    print*, "c2, d2  = ",c1, d2 
    print*, "c2-c1, d2-d1 = ",c2-c1, d2-d1 
end program badvals 

!Program output for ifort v13.0.1.117: (either -O0 or -fast): 
! c1, d1  = 4.250000  3.9062500E-03 
! c2, d2  = 4.250000  1.000000 
! c2-c1, d2-d1 = 0.0000000E+00 0.9960938 

!Program output for pgf90 v12.10-0: (either -O0 or -fast): 
! c1, d1  =  4.250000  1.000000 
! c2, d2  =  4.250000  1.000000 
! c2-c1, d2-d1 =  0.000000  0.000000 

!Program output for gfortran v4.1.2: (either -O0 or -O3): 
! c1, d1  = 4.250000  1.000000 
! c2, d2  = 4.250000  1.000000 
! c2-c1, d2-d1 = 0.000000  0.000000 

これらの違いの背景には、「機能」と見なされる歴史がありますか?または、これはインテルの部分ではっきりとしたバグでしょうか?ウェブを検索

-Bill

+0

したがって、MSBとIanHからの応答に基づいて、これはifortの「機能」です。一般的に、私がこれから家に持ち帰るのは、「2つの算術演算子を隣り合わせにしない」というルールを私の考えに加える必要があるということです。そして、いつものように、かっこで寛大にしてください。 IanHが提供するリンクは、ifortの心の中で起こっていることを理解するのに本当に役立ちます。単一+優先順位が*とバイナリ+ - の間にあるため、*を+に変更したときに見られるさまざまな動作は同じです。 –

答えて

5

、私は2つの連続した事業者が許可されていないことを、その文を見つけます。したがって、この表現を拒否するのではなく、解釈は言語の拡張です。この拡張は、さまざまなコンパイラベンダーによって異なって実装されています。

確かに、私は制限コンパイラオプションでのgfortranを使用する場合、それは、このコードの例を拒否:同様

badvals.f90:9.11: 
    c1 = a**-2+b 
      1 
Error: Extension: Unary operator following arithmetic operator (use parentheses) at (1) 
badvals.f90:13.11: 

    d1 = a**-2*b 
      1 
Error: Extension: Unary operator following arithmetic operator (use parentheses) at (1) 

、制限コンパイラオプション付きのifortは、以下の機能を提供します。

だから、
badvals.f90(9): warning #7026: Non-standard extension 
    c1 = a**-2+b 
----------^ 
badvals.f90(13): warning #7026: Non-standard extension 
    d1 = a**-2*b 
----------^ 

: 1 ) 2)そのバグよりも拡張子が多い 3)この式が言語によって許可されていても、gfortランのアドバイスは良いです - 必要ない場合でも明瞭にするためにカッコを使用してください。

+2

"2つの連続した演算子は許可されていません"というのは少し資格が必要です。レベル2の式(算術演算子)の構文規則のためにここに当てはまりますが、一般的にはそうではありません。 。 to_be'は大丈夫です(Shakespearean Fortranでよく使われていました)。そこに定義された単項演算子もスリップできます。 OPが拡張機能の正式な記述を求めている場合は、[this](http://software.intel.com/sites/products/documentation/doclib/stdxe/2013/composerxe/compiler/fortran-win/GUID- A03254E4-36D6-4CFC-9DF6-AD264BB6C820.htm)。 – IanH

+0

これらの制限オプションは何ですか? – DartLenin