2010-05-03 19 views
6

द्वारा गणना किए गए मानों के बीच विसंगति मैं कहूंगा कि फोरट्रान और सी ++ द्वारा गणना की गई संख्यात्मक मान अधिक समान होंगे। हालांकि, जो मैं अनुभव कर रहा हूं, उससे पता चला है कि गणना की गई संख्या बहुत कम दशमलव अंकों के बाद अलग हो जाती है। मैं इस समस्या को पूर्व भाषा से बाद में कुछ विरासत कोड पोर्ट करने की प्रक्रिया के दौरान आया हूं। मूल फोरट्रान 77 कोड ...फोरट्रान और सी ++

INTEGER M, ROUND 
    DOUBLE PRECISION NUMERATOR, DENOMINATOR 

    M = 2 
    ROUND = 1 
    NUMERATOR=5./((M-1+(1.3**M))**1.8) 
    DENOMINATOR = 0.7714+0.2286*(ROUND**3.82) 
    WRITE (*, '(F20.15)') NUMERATOR/DENOMINATOR 
    STOP 

... आउटपुट .842201471328735, अपनी सी जबकि ++ बराबर ...

int m = 2; 
int round = 1; 
long double numerator = 5.0/pow((m-1)+pow(1.3, m), 1.8); 
long double denominator = 0.7714 + 0.2286 * pow(round, 3.82); 
std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(15) 
      << numerator/denominator << std::endl; 
exit(1); 

... रिटर्न .842201286195064। यही है, गणना मान के बराबर हैं, केवल छठे दशमलव तक। यद्यपि विशेष रूप से एक फोरट्रान वकालतकर्ता नहीं, मैं अपने परिणामों को 'सही' के रूप में मानने के इच्छुक हूं, जिसने संख्या क्रंचर की वैध प्रतिष्ठा दी है। हालांकि, मैं गणना मूल्यों के बीच इस अंतर के कारण के बारे में चिंतित हूं। क्या किसी को पता है कि इस विसंगति का कारण क्या हो सकता है?

+1

http://docs.sun.com/source/806-3568/ncg_goldberg.html –

+0

सी ++ परिणाम अधिक सही '0.8422012861950640318689334181' – jfs

+0

शायद तुम कोड के दोनों सेट में कुछ मध्यवर्ती मूल्यों प्रिंट आउट कर सकता है। –

उत्तर

11

फोरट्रान में, डिफ़ॉल्ट रूप से, फ़्लोटिंग पॉइंट अक्षर एक सटीक होते हैं, जबकि सी/सी ++ में वे डबल परिशुद्धता होते हैं।

इस प्रकार, आपके फोरट्रान कोड में, NUMERATOR की गणना करने की अभिव्यक्ति एकल परिशुद्धता में की जाती है; NUMERATOR चर के अंतिम परिणाम को निर्दिष्ट करते समय इसे केवल डबल परिशुद्धता में परिवर्तित किया जाता है।

और अभिव्यक्ति के लिए वही बात जो वैनेमनेटर चर को आवंटित मान की गणना करती है।

+1

बिल्कुल। यह एक आम गलती है - दाईं तरफ की अभिव्यक्ति बाईं ओर उस चर को "पता" नहीं करती है जो डबल परिशुद्धता है। फोरट्रान 77 तरीका यह निर्दिष्ट करने के लिए कि एक फ्लोट स्थिरांक डबल परिशुद्धता है प्रत्यय "डी 0" जोड़ने के लिए - यह विरासत FORTRAN कोड में जोड़ने का प्रयास करें। –

+0

धन्यवाद आप दोनों। इसके अलावा, केवल संदर्भ उद्देश्यों के लिए, और जैसा कि जेएफ सेबेस्टियन ने इंगित किया है, -फ्रेडफॉल्ट-असली -8 का उपयोग डबल परिशुद्धता फ़्लोटिंग पॉइंट अक्षर का उपयोग करने के लिए gfortran के साथ संकलन करते समय किया जा सकता है। – plok

+0

मुझे पता है कि यह एक पुराना धागा है, लेकिन मैंने आज कुछ मूल्यवान सीखा जो हमारे कोड में एक विसंगति को हल करता है। धन्यवाद @ एमएसबी। "डी 0" टिप के लिए। – jitihsk

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

  • कोई संबंधित समस्या नहीं^_^