2013-03-14 18 views
5

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

+0

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 + -. –

Odpowiedz

5

wyszukać w internecie, uważam, że stwierdzenie, że dwa kolejne podmioty nie są dozwolone. Dlatego interpretacja zamiast odrzucania tego wyrażenia jest rozszerzeniem tego języka. To rozszerzenie zostało inaczej zaimplementowane przez różnych dostawców kompilatorów.

Rzeczywiście, podczas korzystania gfortran restrykcyjne opcji kompilatora, odrzuca ten przykład kod:

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) 

Podobnie ifort restrykcyjne opcji kompilatora stanowi:

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

sposób: 1) używanie opcji ostrzeżeń i błędów kompilatora może być bardzo pomocne, 2) jest większym rozszerzeniem niż błąd, 3) nawet jeśli wyrażenie to było dozwolone przez język, gfort Porada ran jest dobra - użyj nawiasów dla jasności, nawet jeśli nie jest to wymagane.

+2

"Dwa kolejne operatory nie są dozwolone" wymaga niewielkiej kwalifikacji - stosuje się tutaj ze względu na reguły składni dla wyrażeń poziomu drugiego (te arytmetyczne), ale ogólnie nie ... "to_be .lub. .nie. to_be' jest ok (i było dość powszechne w Shakespearean Fortran) i możesz tam wsunąć zdefiniowanego jednoargumentowego operatora. Jeśli OP chce formalnego opisu rozszerzenia, może przeczytać [to] (http://software.intel.com/sites/products/documentation/doclib/stdxe/2013/composerxe/compiler/fortran-win/GUID- A03254E4-36D6-4CFC-9DF6-AD264BB6C820.htm). – IanH

+0

Co to są te restrykcyjne opcje? – DartLenin

Powiązane problemy