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