ifort

5

के साथ एक्सपोनेंट के लिए फोरट्रान ऑपरेटर प्राथमिकता त्रुटि मुझे पोर्टलैंड और इंटेल फोर्ट्रान कंपाइलर्स के बीच अलग-अलग व्यवहार मिल रहा है जब एक एक्सपोनेंट के साथ एक एक्सपोनेंट के साथ एक सरल अभिव्यक्ति का मूल्यांकन किया जाता है। मुझे पूरा यकीन है कि पीजीएफ 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

+0

तो, एमएसबी और इयानएच की प्रतिक्रिया के आधार पर, यह इफोर्ट की "विशेषता" होगी। आम तौर पर, मैं इससे घर लेता हूं कि मुझे अपनी सोच में "एक दूसरे के बगल में दो अंकगणित ऑपरेटर न डालें" नियम जोड़ने की जरूरत है। और हमेशा के रूप में, कोष्ठक के साथ उदार हो। आईएएनएच द्वारा प्रदान किया गया लिंक यह समझने में वास्तव में सहायक है कि इफोर्ट के दिमाग में क्या हो रहा है। एक + को * बदलते समय मैं देखता हूं कि अलग-अलग व्यवहार इसलिए है क्योंकि यूनरी + - प्राथमिकता * और बाइनरी + - के बीच होती है। –

उत्तर

5

वेब सर्च कर रहे हैं, मुझे लगता है कि यह बयान कि लगातार दो ऑपरेटरों की अनुमति नहीं है पाते हैं। इसलिए इस अभिव्यक्ति को अस्वीकार करने के बजाय व्याख्या करना भाषा का विस्तार है। वह एक्सटेंशन अलग-अलग संकलक विक्रेताओं द्वारा अलग-अलग कार्यान्वित किया गया है।

दरअसल, जब मैं प्रतिबंधात्मक संकलक विकल्पों के साथ 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) भले ही इस अभिव्यक्ति को भाषा, गफ्फेट द्वारा अनुमत किया गया हो भाग की सलाह अच्छी है - यदि आवश्यक नहीं है तो भी स्पष्टता के लिए ब्रांड्स का उपयोग करें।

+2

"दो लगातार ऑपरेटरों की अनुमति नहीं है" को थोड़ा योग्यता की आवश्यकता है - यह स्तर दो अभिव्यक्तियों (अंकगणितीय वाले) के लिए वाक्यविन्यास नियमों के कारण यहां लागू होता है लेकिन आम तौर पर नहीं ... 'to_be। या। ।नहीं। to_be' ठीक है (और शेक्सपियर फोर्ट्रान में काफी आम था) और आप वहां भी एक परिभाषित यूनरी ऑपरेटर को फिसल सकते हैं। यदि ओपी विस्तार का औपचारिक विवरण चाहता है, तो वे [यह] पढ़ सकते हैं (http://software.intel.com/sites/products/documentation/doclib/stdxe/2013/composerxe/compiler/fortran-win/GUID- A03254E4-36D6-4CFC-9DF6-AD264BB6C820.htm)। – IanH

+0

इन प्रतिबंधक विकल्प क्या हैं? – DartLenin

संबंधित मुद्दे