के साथ एक्सपोनेंट के लिए फोरट्रान ऑपरेटर प्राथमिकता त्रुटि मुझे पोर्टलैंड और इंटेल फोर्ट्रान कंपाइलर्स के बीच अलग-अलग व्यवहार मिल रहा है जब एक एक्सपोनेंट के साथ एक एक्सपोनेंट के साथ एक सरल अभिव्यक्ति का मूल्यांकन किया जाता है। मुझे पूरा यकीन है कि पीजीएफ 9 0 (और गोरफ्रान) ऑपरेटर प्राथमिकता की मेरी समझ के आधार पर सही तरीके से काम कर रहे हैं, लेकिन मुझे दूसरी राय चाहिए क्योंकि इन चीजों को थोड़ा मुश्किल हो सकता है।ifort
यहां मेरा कोड एक बहुत ही बुनियादी रूप में सरल है। Ifort के साथ चलने पर फॉर्म d1=a**-2*b
की अभिव्यक्ति को d1=a**(-2*b)
के रूप में d1=(a**-2)*b
द्वारा pgf90 और gfortran द्वारा misorted किया जाता है। अगर मैं एक्सपोनेंट से नकारात्मक संकेत हटा देता हूं, तो सभी तीन कंपाइलर्स इसे d1=(a**2)*b
के रूप में समझते हैं। अगर मैं * बी से + बी बदलता हूं तो मुझे तीनों से अच्छा व्यवहार भी मिलता है।
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
तो, एमएसबी और इयानएच की प्रतिक्रिया के आधार पर, यह इफोर्ट की "विशेषता" होगी। आम तौर पर, मैं इससे घर लेता हूं कि मुझे अपनी सोच में "एक दूसरे के बगल में दो अंकगणित ऑपरेटर न डालें" नियम जोड़ने की जरूरत है। और हमेशा के रूप में, कोष्ठक के साथ उदार हो। आईएएनएच द्वारा प्रदान किया गया लिंक यह समझने में वास्तव में सहायक है कि इफोर्ट के दिमाग में क्या हो रहा है। एक + को * बदलते समय मैं देखता हूं कि अलग-अलग व्यवहार इसलिए है क्योंकि यूनरी + - प्राथमिकता * और बाइनरी + - के बीच होती है। –