नहीं, यह एक और "क्यों (1 / 3.0) * 3! = 1" प्रश्न नहीं है।
मैं हाल ही में फ्लोटिंग-पॉइंट्स के बारे में पढ़ रहा हूं; विशेष रूप से, एक ही गणना विभिन्न आर्किटेक्चर या अनुकूलन सेटिंग्स पर अलग- अलग परिणाम कैसे दे सकती है ।
यह वीडियो गेम के लिए एक समस्या है जो रिप्ले स्टोर करता है, या पीयर-टू-पीयर नेटवर्केड (सर्वर-क्लाइंट के विपरीत) है, जो प्रोग्राम को चलाने पर हर बार ठीक उसी परिणाम उत्पन्न करने वाले सभी क्लाइंट पर भरोसा करते हैं - एक समस्या में एक छोटी सी विसंगति फ्लोटिंग-पॉइंट गणना विभिन्न मशीनों (या यहां तक कि एक ही मशीन पर! ) पर काफी भिन्न गेम-स्टेट हो सकती है ।
यह उन प्रोसेसर के बीच भी होता है जो IEEE-754 को "फॉलो" करते हैं , मुख्यतः क्योंकि कुछ प्रोसेसर (अर्थात् x86) डबल विस्तारित परिशुद्धता का उपयोग करते हैं । यही है, वे सभी गणना करने के लिए 80-बिट रजिस्टरों का उपयोग करते हैं, फिर 64- या 32-बिट्स को काटते हैं, जिससे मशीनों की तुलना में अलग-अलग राउंडिंग परिणाम होते हैं जो गणना के लिए 64- या 32- बिट्स का उपयोग करते हैं।
मैंने इस समस्या के कई समाधान ऑनलाइन देखे हैं, लेकिन C ++ के लिए सभी, C #:
- डबल विस्तारित-सटीक मोड को अक्षम करें (ताकि सभी
double
गणना IEEE-754 64-बिट्स)_controlfp_s
(विंडोज),_FPU_SETCW
(लिनक्स?), याfpsetprec
(बीएसडी) का उपयोग करें। - हमेशा एक ही कंपाइलर सेटिंग्स के साथ एक ही कंपाइलर चलाएं, और सभी उपयोगकर्ताओं को एक ही सीपीयू आर्किटेक्चर (कोई क्रॉस-प्लेटफ़ॉर्म प्ले) की आवश्यकता नहीं है। क्योंकि मेरा "कंपाइलर" वास्तव में जेआईटी है, जो हर बार प्रोग्राम चलने पर अलग-अलग अनुकूलन कर सकता है , मुझे नहीं लगता कि यह संभव है।
- निश्चित-बिंदु अंकगणित का उपयोग करें,
float
औरdouble
पूरी तरह से बचें ।decimal
इस उद्देश्य के लिए काम करेगा, लेकिन यह बहुत धीमा होगा, औरSystem.Math
पुस्तकालय कार्यों में से कोई भी इसका समर्थन नहीं करता है।
तो, क्या यह C # में भी एक समस्या है? क्या होगा यदि मैं केवल विंडोज (मोनो नहीं) का समर्थन करना चाहता हूं?
यदि यह है, तो क्या मेरे कार्यक्रम को सामान्य डबल-परिशुद्धता पर चलने के लिए मजबूर करने का कोई तरीका है?
यदि नहीं, तो क्या कोई पुस्तकालय है जो फ्लोटिंग-पॉइंट गणनाओं को सुसंगत रखने में मदद करेगा ?
strictfp
कीवर्ड है, जो सभी गणनाओं को एक विस्तारित आकार के बजाय निर्दिष्ट आकार ( float
या double
) में करने के लिए मजबूर करता है । हालांकि, जावा को अभी भी IEE-754 समर्थन के साथ कई समस्याएं हैं। बहुत (बहुत, बहुत) कुछ प्रोग्रामिंग भाषाएं IEE-754 अच्छी तरह से समर्थन करती हैं।