क्या मुझे अभी भी कंप्यूटर संचालन की गारंटी के लिए निश्चित बिंदु का उपयोग करने की आवश्यकता है जो गणित के संचालन के लिए समान परिणाम प्राप्त करता है?


9

मुझे बताया गया था कि अधिकांश आधुनिक कंप्यूटर एक ही फ्लोटिंग पॉइंट मानक का पालन करते हैं, क्या इसका मतलब यह है कि वे सभी दिए गए गणित ऑपरेशन के लिए एक ही फ्लोट उत्तर प्राप्त करेंगे यदि इनपुट समान हैं?

मैं पूछता हूं क्योंकि मैं एक नेटवर्क पर एक आरटीएस गेम बनाने में शोध कर रहा हूं, और सैकड़ों यूनिट की स्थिति को सिंक करना एक बुरे रास्ते की तरह लगता है।

इसलिए यदि मैं केवल इनपुट भेजता हूं, तो मुझे उन सभी इनपुटों से सिमुलेशन चलाने के लिए सभी ग्राहकों को समान परिणाम प्राप्त करने की आवश्यकता है।

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

क्या कंप्यूटर में अभी भी विचलन होता है, भले ही वे समान फ्लोट बिंदु मानक का पालन करते हों?

मैं इस खेल को C # में नहीं लिख रहा हूँ अगर यह मायने नहीं रखता है, तो मुझे लगता है कि मैं वैसे भी इसका उल्लेख करूँगा।


यहां तक ​​कि अगर वे करते हैं, तो मैं उसके लिए फ्लोट्स का उपयोग नहीं
करूंगा

क्या मतलब ? क्यों नहीं?
WDUK

वैसे भी झांकियों का उपयोग अवांछनीय हो सकता है क्योंकि व्यवहार मानचित्र पर स्थिति पर निर्भर हो सकता है। Minecraft की दूर की भूमि एक अधिक उल्लेखनीय उदाहरण थी: आंदोलन, प्रतिपादन, और इलाके की पीढ़ी गड़बड़ हो जाएगी क्योंकि आप स्पॉन बिंदु से बहुत दूर चले गए थे।
आमोन

जवाबों:


18

क्या कंप्यूटर में अभी भी विचलन होता है, भले ही वे समान फ्लोट बिंदु मानक का पालन करते हों?

दुर्भाग्य से, हाँ, खासकर जब आप C # (या किसी अन्य JIT संकलित भाषा) का उपयोग करते हैं। यहां जो समस्या होती है, वह यह है कि कुछ प्रोसेसर आर्किटेक्चर पर JIT संकलन चरण कोड का उत्पादन करता है जो अन्य आर्किटेक्चर की तुलना में अधिक सीपीयू रजिस्टरों का उपयोग करता है। यह उन परिस्थितियों को जन्म दे सकता है जहां कुछ मशीनों पर, विस्तारित फ्लोटिंग पॉइंट सटीक का उपयोग कुछ कार्यों के लिए किया जाता है, जबकि अन्य मशीनों पर नहीं। डबल्स का उपयोग करके प्रत्येक पुनरावृत्त गणना के लिए इसका मतलब है, विभिन्न संचित गोलाई त्रुटियों का उत्पादन करने का एक मौका है।

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


इस। कुछ मूल कारण: IEEE Std 754 में वैकल्पिक "शामिल होना चाहिए" (जैसे NaN हैंडलिंग) और डिज़ाइन विकल्प (जैसे अंडरफ़्लो का पता लगाना) को अनुमति देता है। जहाँ तक भाषा बाइंडिंग फ़्लोटिंग-पॉइंट मानक का समर्थन करते हैं, वे फ़्लॉइंट-पॉइंट एक्सप्रेशन का मूल्यांकन करते समय कंपाइलर को लेवे दे सकते हैं, जैसे FLT_EVAL_METHODISO C / C ++ में। ट्रान्सेंडैंटल कार्यों (उदाहरण के लिए sin, exp, log) काफी हद तक दोनों आईईईई फ्लोटिंग प्वाइंट मानक और भाषा मानकों प्रोग्रामिंग द्वारा विनियमित नहीं कर रहे हैं। एक साधारण पुस्तकालय संस्करण उन्नयन (उदाहरण के लिए एक नया glibcसंस्करण) परिणाम भिन्न कर सकता है।
njuffa

मैंने इसे खेल में खुद मारा है। रॉकेट मेरे लैपटॉप पर ठीक से उड़ गया, मेरे डेस्कटॉप पर नहीं उड़ पाएगा, पूरी तरह से समान इंस्टॉलेशन।
लोरेन Pechtel

3

फ्लोटिंग पॉइंट एरर्स

प्रत्येक फ़्लोटिंग पॉइंट संख्या में खराबी जमा होती है क्योंकि इसका उपयोग गणना के लिए किया जाता है। यह गणना करने के लिए एक अव्यवस्थित प्रारूप का उपयोग करने का एक सरल तथ्य है। गणना गणना के क्रम के प्रति भी संवेदनशील है, कम्यूटेटिविटी की गारंटी नहीं है, अर्थात: के रूप में (a + b) + cया नहीं हो सकता है a + (b + c)

इसके अतिरिक्त प्रोसेसर जरूरी नहीं कि स्मृति मानक के समान मंटिसा की लंबाई हो। यह दिलचस्प व्यवहार उत्पन्न कर सकता है क्योंकि 32/64/128 बिट फ्लोट कभी-कभी काम करते हैं जैसे कि उनके पास अधिक बिट्स हैं।

फिक्स्ड-प्वाइंट त्रुटियां

कहा जा रहा है कि निश्चित बिंदु अंकगणित भी त्रुटियों को जमा कर सकता है। अंतर यह है कि निश्चित बिंदु संख्या स्पष्ट है कि क्या सटीकता खो गई है, और चुने हुए संचालन के आधार पर पूरी तरह से त्रुटियों को गोल करने से बच सकते हैं। वे प्रशंसनीय भी हैं (a + b) + c = a + (b + c)

कौन कौन से?

कौन सा उपयोग करना है यह पूरी तरह से इस बात पर निर्भर करता है कि आपको किन गुणों की आवश्यकता है।

दशमलव संख्याएं:

  • मानों की एक विशाल श्रृंखला दें जो बहुत बारीक हो जाए, और उत्तरोत्तर चरम सीमाओं पर अलग हो जाएं।
  • गणना के आदेश के प्रति संवेदनशील हैं
  • समय के साथ गोलाई त्रुटियों को जमा करें।
  • हार्डवेयर / मेमोरी फ्लोट आकार बेमेल के कारण अनियमित व्यवहार हो सकता है।

फिक्स्ड प्वाइंट नंबर:

  • किसी भी दो लगातार संख्याओं के बीच समान दूरी के साथ छोटी संख्या दें।
  • गणना के क्रम के प्रति कम संवेदनशील हैं
  • गोलाई त्रुटियों के बारे में स्पष्ट हैं
  • गोलाई के मुद्दों को कम करने / टालने के साथ काम किया जा सकता है।

1
"निश्चित बिंदु संख्याएँ स्पष्ट हैं कि क्या सटीकता खो गई है" - फ़्लोटिंग पॉइंट भी स्पष्ट हैं, फ़र्क यह है कि फ़िक्स पॉइंट
गलतियाँ

1
तो केवल निश्चित बिंदु हार्डवेयर की परवाह किए बिना सभी कंप्यूटरों की गारंटी देता है / समान त्रुटियों / सटीक नुकसान का अनुभव करेगा?
WDUK

1
अनिवार्य रूप से, हां, क्योंकि आप यह निर्दिष्ट कर सकते हैं कि आपके निश्चित बिंदु संख्या 32 या 64 बिट्स हैं, और वे सभी प्रणालियों पर होंगे। फ्लोटिंग पॉइंट संख्या 32 या 64-बिट हो सकती है, लेकिन हार्डवेयर वास्तव में गणना करने के लिए 48 या 96 बिट का उपयोग कर सकता है और अंत में 32 या 64 बिट में परिवर्तित हो सकता है जिसके परिणामस्वरूप विभिन्न प्रकार के हार्डवेयर के बीच अंतर होता है।
user1118321

@whatsisname चल बिन्दु विनिर्देशों काफी स्पष्ट हैं, तो आप आसानी से मुझे नहीं बता सकता कि गोलाई मुद्दों मैं इस राशि में सामना करेंगे: (a + b * c) / d - e। इस तरह के स्पष्ट मुद्दों को छोड़कर NaN, शून्य से विभाजन, या अतिप्रवाह / अंतर्प्रवाह इस अभिव्यक्ति के गलत होने के लिए संभव है। इसमें जोड़ें कि स्मृति के बीच की बाधा और परिशुद्धता के संदर्भ में रजिस्टर और यहां तक ​​कि "समान" फ्लोटिंग पॉइंट वैल्यू की मेमोरी से एक साधारण लोड / स्टोर उत्तर को बदल देगा।
Kain0_0

@ Kain0_0: आप सही कह रहे हैं, मैं आसानी से आपको बता नहीं सकता कि मेरा क्या मुकाबला होगा, क्योंकि मैं एक अस्थायी बिंदु विशेषज्ञ नहीं हूं। यह वही है जो तब होता है जब मैंने कहा "साधारण जीवन संख्या के लिए अधिक सहज"। जब आप कहते हैं कि निश्चित बिंदु "स्पष्ट" है और फ़्लोटिंग पॉइंट नहीं है, तो आप इसे ध्वनि बनाते हैं जैसे कि फ़्लोट केवल अनियमित रूप से गलत प्रतीत होते हैं।
whatsisname

-1

यह सवाल है कि आप समान परिणामों की गारंटी क्यों देना चाहते हैं, क्योंकि समान परिणाम कोई गारंटी नहीं देते हैं कि आपके परिणाम उपयोगी हैं

आपके पास एक संख्यात्मक अस्थिर एल्गोरिदम हो सकता है जो विभिन्न कंप्यूटरों में दो समान लेकिन पूरी तरह से निरर्थक परिणाम देता है। यदि अंतर हैं, लेकिन परिणाम 13 अंकों के भीतर समान हैं, तो यह बहुत अधिक विश्वसनीय है।

ऐसी बहुत कम स्थितियाँ हैं जहाँ प्रतिलिपि प्रस्तुतिकरण वास्तव में महत्वपूर्ण है: एक लेआउट इंजन में, या दोषरहित संपीड़न / अपघटन। निश्चित बिंदु का उपयोग करके गुमराह होने की संभावना है।


मैंने आपके उत्तर को अस्वीकार नहीं किया, लेकिन ऐसा लगता है कि ओपी द्वारा वर्णित मामला "वास्तव में उन कुछ स्थितियों में से एक है जहां प्रजनन क्षमता वास्तव में महत्वपूर्ण है"। आरटीएस गेम में, एक छोटी गोलाई त्रुटि "दो ऑब्जेक्ट्स टकरा गई" या नहीं के बीच अंतर कर सकती है।
डॉक ब्राउन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.