ऐसी कई तकनीकी चुनौतियां हैं, जो कम्प्यूटेशनल परिणामों की सटीक बिट-फॉर-बिट बिट प्रजनन क्षमता बनाती हैं।
सॉफ़्टवेयर स्तर पर, कोड या कोड द्वारा उपयोग की जाने वाली किसी भी लाइब्रेरी में परिवर्तन स्पष्ट रूप से अलग-अलग परिणाम उत्पन्न कर सकता है। आप एक विशिष्ट वैज्ञानिक कोड में लिंक किए गए समर्थन पुस्तकालयों की संख्या से आश्चर्यचकित हो सकते हैं।
एक निचले स्तर पर, किसी भी कोड या नए संकलक के साथ या अलग-अलग संकलक अनुकूलन के साथ कोड द्वारा उपयोग किए जाने वाले पुस्तकालयों में से किसी एक को पुनः स्थापित करना भी समस्या पैदा कर सकता है। एक कारण यह है कि कोड के विभिन्न ऑपरेशनों को एक अलग क्रम में किया जा सकता है जब कोड को फिर से जोड़ा जाता है। चूँकि फ़्लोटिंग पॉइंट जोड़ सहयोगी नहीं है (a + b) + c <> a + (b + c), यह अलग-अलग परिणाम दे सकता है।
ठीक है, तो क्या होगा यदि हम संपूर्ण सॉफ़्टवेयर वातावरण (OS, पुस्तकालयों और संकलित कोड) को संरक्षित करते हैं (उदाहरण के लिए) इसे एक बूट करने योग्य सीडी-रोम पर जल रहा है जो कोड चलाएगा। अब क्या हम सुनिश्चित कर सकते हैं कि यदि हम इस कोड को किसी अन्य कंप्यूटर पर चलाते हैं तो हमें वही परिणाम प्राप्त होंगे?
हैरानी की बात है, कुछ कोड वास्तव में कम्प्यूटेशन के विशेष प्रोसेसर मॉडल के पहलुओं के आधार पर भिन्न होते हैं जो वे चल रहे हैं। उदाहरण के लिए, अनुकूलित रैखिक बीजगणित पुस्तकालय आमतौर पर उन ब्लॉकों पर काम करने के लिए मैट्रिक्स गुणा को तोड़ते हैं जो कैश में फिट होंगे। जब इंटेल एक नए माइक्रोप्रोसेसर को बड़े कैश के साथ जारी करता है तो कोड गतिशील रूप से ब्लॉक आकार को समायोजित कर सकता है, जिसके परिणामस्वरूप अंकगणित होता है जो एक अलग क्रम में किया जाता है और विभिन्न परिणाम देता है। अन्य कोड गतिशील रूप से उपलब्ध मेमोरी की मात्रा के आधार पर कम्प्यूटेशंस के क्रम को समायोजित करते हैं- यदि आप अधिक मेमोरी वाले कंप्यूटर पर कोड चलाते हैं जो कि अंकगणित को एक अलग क्रम में किया जा सकता है और इस प्रकार अलग-अलग परिणाम दे सकता है।
जब आप मल्टीथ्रेडेड कोड में फेंकते हैं तो चीजें आश्चर्यजनक रूप से अधिक जटिल हो जाती हैं, क्योंकि विभिन्न थ्रेड्स का सटीक निष्पादन इतिहास अक्सर गैर-नियतात्मक होता है और इससे फिर से एक रन से दूसरे क्रम में अंकगणितीय ऑपरेशन किए जा सकते हैं।
व्यवहार में सबसे अधिक है कि आप वास्तव में के लिए उम्मीद कर सकते हैं परिणाम है कि एक मशीन से दूसरे के समान हैं, इस्तेमाल किया एल्गोरिथ्म की सटीकता सहिष्णुता तक। उदाहरण के लिए, यदि मुझे रूट फाइंडिंग प्रॉब्लम है और + -1.0 -10 के भीतर एक रूट पाने के लिए बाइसेक्शन का उपयोग करते हैं, तो मुझे तब तक खुश रहना चाहिए जब तक कि अलग-अलग मशीनें जवाब तैयार कर रही हैं जो उस सहनशीलता के भीतर सहमत हैं।