2010-03-04 14 views
5

के आधार पर फ़्लोटिंग पॉइंट गणना परिवर्तन जब मैं सटीक वही कोड चलाता हूं जो विंडोज और सोलारिस पर संकलित सटीक उसी फ़्लोटिंग पॉइंट गणना (युगल का उपयोग करके) करता है, तो मुझे थोड़ा अलग परिणाम मिलते हैं।कंपाइलर

मुझे पता है कि परिणाम गोल करने की त्रुटियों के कारण सटीक नहीं हैं। हालांकि, मैंने उम्मीद की थी कि राउंडिंग त्रुटियां प्लेटफॉर्म-स्वतंत्र हों, जिससे दोनों प्लेटफ़ॉर्म पर समान (थोड़ा गलत) परिणाम दिया जा सके, जो मामला नहीं है।

क्या यह सामान्य है, या क्या मुझे मेरे कोड में कोई और समस्या है?

+2

आप अपने कोड का एक परीक्षण का मामला पोस्ट करता है, तो यह मदद मिलेगी। ऐसी समस्या के लिए, परीक्षण केस 3-4 लाइनों से अधिक नहीं होना चाहिए। – Sparr

+1

संभावित डुप्लिकेट [एक ही कोड 32 बनाम 64-बिट मशीनों पर अलग संख्यात्मक परिणाम क्यों देगा?] (Http://stackoverflow.com/questions/7847274/why-would-the-same-code-yield- अलग- संख्यात्मक-परिणाम-ऑन -32-बनाम -64-बिट-मशीन) –

उत्तर

6

x86 पर, आमतौर पर अधिकतर गणना 80-बिट मात्राओं के साथ होती है, जब तक कि अन्यथा डबल-परिशुद्धता न हो। अधिकांश अन्य आर्किटेक्चर जिन्हें मैं जानता हूं कि डबल-परिशुद्धता में सभी गणनाएं (फिर से, जब तक कि अन्यथा ओवरराइड न हो)।

मुझे नहीं पता कि आप SPARC या x86 पर सोलारिस चला रहे हैं, लेकिन यदि पूर्व में, तो मुझे बहुत संदेह है कि अंतर का कारण बनना है।

+1

यदि यह सोलारिस x86 है, तो यह 80-बिट प्रतिनिधित्व अभी भी अंतर का कारण होने की संभावना है। X86 पर फ़्लोटिंग-पॉइंट कंप्यूटेशंस केवल 80-बिट मात्राओं के साथ होता है यदि यह (अंतर्निहित) x87 गणित कॉप्रोसेसर का उपयोग कर रहा है; यदि यह नई एसएसई वेक्टर इकाई का उपयोग कर रहा है, तो वे सामान्य 64-बिट युगल हैं। जीसीसी पुराने प्रोसेसर के साथ संगतता के लिए x87 का उपयोग करने के लिए डिफ़ॉल्ट रूप से होगा; कोई अन्य कंपाइलर एसएसई इकाई का उपयोग करेगा क्योंकि यह उन चीजों के लिए भी तेज है जो वेक्टर नहीं हैं। –

+0

@ ब्रूक: धन्यवाद! बहुत अच्छा स्पष्टीकरण। –

+3

आपका स्वागत है! वैसे, http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323 इसकी एक विस्तृत संपूर्ण चर्चा है। (यह 'जीसीसी फ्लोटिंग पॉइंट बग' के लिए पहला Google परिणाम भी है, जो आपको बताएगा कि लोग इस मुद्दे में कितनी बार दौड़ते हैं!) –

1

आपके प्रश्न का विषय बताता है कि यह संकलक पर निर्भर हो सकता है। यह हो सकता है, लेकिन तथ्य यह है कि आप विभिन्न हार्डवेयर पर चल रहे हैं (माना जाता है कि आपका सोलारिस x86 नहीं है) अंतर के लिए एक अधिक संभावित कारण बताता है - हार्डवेयर में अंतर।

विभिन्न हार्डवेयर प्लेटफॉर्म विभिन्न परिणामों पर पहुंचने, फ़्लोटिंग-पॉइंट गणना करने के लिए पूरी तरह से अलग हार्डवेयर डिवाइस (एफपीयू, सीपीयू) का उपयोग कर सकते हैं।

इसके अलावा, अक्सर एफपीयू इकाइयां कुछ निरंतर सेटिंग्स, जैसे इन्फिनिटी मॉडल, राउंडिंग मोड इत्यादि द्वारा कॉन्फ़िगर करने योग्य होती हैं। विभिन्न हार्डवेयर में अलग-अलग डिफ़ॉल्ट सेटअप हो सकते हैं। कंपाइलर सामान्य रूप से कोड उत्पन्न करेगा जो प्रोग्राम स्टार्टअप पर एफपीयू शुरू करेगा, प्रारंभिक सेटअप भी अलग-अलग हो सकता है।

अंत में, सी ++ भाषा के विभिन्न कार्यान्वयन अलग-अलग फ्लोटिंग-पॉइंट सेमेटिक्स को लागू कर सकते हैं, इसलिए आपको एक ही हार्डवेयर के विभिन्न सी ++ कंपाइलर्स से अलग-अलग परिणाम मिल सकते हैं।

2

मेरा मानना ​​है कि विंडोज/x86 के तहत, आपका कोड x87 परिशुद्धता के साथ पहले से ही 53 बिट्स (डबल परिशुद्धता) पर सेट होगा, हालांकि मुझे यकीन नहीं है कि यह कब सेट हो जाएगा। सोलारिस/x86 पर x87 एफपीयू 64 बिट्स (विस्तारित परिशुद्धता) की डिफ़ॉल्ट परिशुद्धता का उपयोग करने की संभावना है, इसलिए अंतर।

एक सरल जांच आप पता लगाने के लिए जो परिशुद्धता (53 बिट या 64 बिट्स) किया जा रहा है क्या कर सकते हैं:, 1e16 + 2.9999 की तरह कुछ कंप्यूटिंग की कोशिश करते हुए संकलक निरंतर तह अनुकूलन से बचने के लिए सावधान किया जा रहा है (उदाहरण के लिए, एक अलग add समारोह को परिभाषित अतिरिक्त करने के लिए, और किसी भी अनुकूलन को बंद करें जो फ़ंक्शन इनलाइन कर सकता है)। 53-बिट परिशुद्धता (एसएसई 2, या x87 डबल-परिशुद्धता मोड में उपयोग करते समय) यह 1e16 + 2 देता है; 64-बिट परिशुद्धता (विस्तारित परिशुद्धता मोड में x87) का उपयोग करते समय यह 1e16 + 4 देता है। बाद का परिणाम 'डबल राउंडिंग' नामक प्रभाव से आता है, जहां अतिरिक्त परिणाम 64 बिट्स तक और फिर 53 बिट्स तक गोल होता है । (पाइथन में सीधे यह गणना करना, मुझे 32-बिट लिनक्स पर 1e16 + 4, और विंडोज़ पर 1e16 + 2 मिलता है, ठीक उसी कारण से।)

यहां एक बहुत अच्छा लेख है (जो कि काफी महत्वपूर्ण है- उद्धृत गोल्डबर्ग की "क्या हर कंप्यूटर वैज्ञानिक पता होना चाहिए ...") है कि समस्याओं x87 एफपीयू के उपयोग से उत्पन्न होने के कुछ बताते हैं:

http://hal.archives-ouvertes.fr/docs/00/28/14/29/PDF/floating-point-article.pdf

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