मेरे पास सी में लिखा गया एक बड़ा मॉडल (~ 5000 लाइनें) है। यह एक सीरियल प्रोग्राम है, जिसमें कोई रैंडम नंबर जेनरेशन नहीं है। यह FFTW लाइब्रेरी का उपयोग FFT के उपयोग से कार्यों के लिए करता है - मुझे FFTW कार्यान्वयन का विवरण नहीं पता है, लेकिन मुझे लगता है कि इसमें जो कार्य हैं वे निर्धारक भी हैं (मुझे सही करें तो मैं सही हूं)।
जिस समस्या को मैं नहीं समझ सकता, वह यह है कि मुझे एक ही मशीन (एक ही संकलक, एक ही पुस्तकालय) पर समान रनों के लिए परिणामों में छोटे अंतर मिल रहे हैं।
मैं दोहरे-सटीक चर का उपयोग करता हूं, और value
उदाहरण के लिए चर में परिणाम का उत्पादन करने के लिए, मैं जारी करता हूं:
fprintf(outFID, "%.15e\n", value);
या
fwrite(&value, 1, sizeof(double), outFID);
: और मैं लगातार इस तरह के रूप मतभेद मिलेगा
2.07843469652206 4 ई-16 बनाम 2.07843469652206 3 ई-16
मैंने यह जानने में बहुत समय बिताया है कि यह क्यों है। मैंने शुरू में सोचा था कि मेरी एक मेमोरी चिप खराब हो गई है, और मैंने कोई फायदा नहीं हुआ। मैंने बाद में एक सहयोगी की लिनक्स मशीन पर अपना कोड चलाने की कोशिश की, और मुझे उसी प्रकृति के अंतर मिलते हैं।
ऐसा किसके कारण हो सकता है? यह अब एक छोटा सा मुद्दा है, लेकिन मुझे आश्चर्य है कि यह "हिमशैल का टिप" (एक गंभीर समस्या का) है।
मुझे लगा कि मैं StackOverflow के बजाय यहाँ पोस्ट करूँगा अगर कोई संख्यात्मक मॉडल के साथ काम करता है तो इस मुद्दे पर आ सकता है। अगर कोई इस पर प्रकाश डाल सकता है, तो मैं बहुत मजबूर हो जाऊंगा।
फॉलोअप टू कमेंट्स:
क्रिश्चियन क्लैसन और विक्रम: सबसे पहले, मेरे सवाल पर ध्यान देने के लिए धन्यवाद। आपके द्वारा सुझाए गए लेख यह सुझाव देते हैं कि: 1. गोलाई त्रुटियां सटीकता को सीमित करती हैं, और 2. अलग-अलग कोड (जैसे कि प्रतीत होता है हानिरहित प्रिंट स्टेटमेंट) मशीन एप्सिलॉन तक के परिणामों को प्रभावित कर सकते हैं। मुझे स्पष्ट करना चाहिए कि मैं प्रभावों fwrite
और fprintf
कार्यों की तुलना नहीं कर रहा हूं । मैं एक या दूसरे का उपयोग कर रहा हूं। विशेष रूप से, दोनों रन के लिए एक ही निष्पादन योग्य का उपयोग किया जाता है। मैं बस इस मुद्दे को बताते हुए कह रहा हूं कि क्या मैं fprintf
OR का उपयोग करता हूं fwrite
।
तो कोड पथ (और निष्पादन योग्य) समान है, और हार्डवेयर समान है। इन सभी बाहरी कारकों को स्थिर रखने के साथ, मौलिकता, यादृच्छिकता कहां से आती है? मुझे संदेह था कि गलती से मेमोरी सही तरीके से नहीं चल पाने के कारण बिट फ्लिप हो गया था, यही वजह है कि मैंने मेमोरी चिप्स को बदल दिया, लेकिन यह यहां मुद्दा नहीं लगता है, मैंने सत्यापित किया और आपने संकेत दिया। मेरा कार्यक्रम एक ही रन में हजारों इन हजारों सटीक संख्याओं को आउटपुट करता है, और हमेशा एक यादृच्छिक मुट्ठी भर होते हैं जिनमें यादृच्छिक बिट फ़्लिप होते हैं।
ईसाई Clason की पहली टिप्पणी करने के लिए अनुसरण करे: क्यों है मशीन परिशुद्धता के भीतर 0 के रूप में ही? एक डबल के लिए सबसे छोटी सकारात्मक संख्या 2.22e-308 है, इसलिए क्या यह 0 के बराबर नहीं होना चाहिए? मेरा कार्यक्रम 10 ^ -16 रेंज (1e-15 से 8e-17 तक) में हजारों मानों का आउटपुट देता है और हम अपने शोध प्रोजेक्ट में सार्थक बदलाव देख रहे हैं, इसलिए मुझे आशा है कि हम निरर्थक नहीं देख रहे हैं संख्या।
फॉलोअप # 2 :
यह मॉडल द्वारा टाइम सीरीज़ आउटपुट का एक प्लॉट है, जो टिप्पणियों में ऑफशूट चर्चा में सहायता के लिए है।