Otrzymuję różne zachowanie między kompilatorami fortranu z Portland i Intel podczas oceniania prostego wyrażenia z wykładnikiem, po którym następuje mnożenie. Jestem prawie pewien, że pgf90 (i gfortran) działają poprawnie w oparciu o moje zrozumienie pierwszeństwa operatorów, ale chciałbym mieć drugą opinię, ponieważ te rzeczy mogą być nieco trudne.Błąd pierwszeństwa operatora forrana dla wykładnika z ifortem
Oto mój uproszczony kod do bardzo podstawowego formularza. Po uruchomieniu z ifort ekspresja postaci d1=a**-2*b
zostaje zinterpretowana jako d1=a**(-2*b)
przez ifort przez jako d1=(a**-2)*b
przez pgf90 i gfortran. Jeśli usuwam znak ujemny z wykładnika, wszystkie trzy kompilatory interpretują to jako d1=(a**2)*b
. Jeśli zmienię * b na + b, otrzymam również dobre zachowanie od wszystkich trzech.
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
Czy historia kryje się za tymi różnicami, aby uznać je za "cechę"? Czy jest to jawny błąd ze strony Intela?
-Bill
Tak więc, na podstawie odpowiedzi MSB i IanH, byłaby to "cecha" programu ifort. Ogólnie rzecz biorąc, wyciągam z tego dom, że muszę dodać regułę "nie umieszczaj dwóch operatorów arytmetycznych obok siebie" do mojego myślenia. I jak zawsze, bądź hojny z nawiasami. Łącze dostarczone przez IanH jest naprawdę pomocne w zrozumieniu tego, co dzieje się w umyśle iforta. Różne zachowanie, jakie widzę przy zmianie * na a +, jest spowodowane tym, że jednoargumentowy + - pierwszeństwo mieści się pomiędzy * a binarnym + -. –