एक नियतात्मक तरीके से फ्लोटिंग पॉइंट नंबरों को संभालने पर
फ्लोटिंग पॉइंट नियतात्मक है। खैर, यह होना चाहिए। यह जटिल है।
फ्लोटिंग पॉइंट नंबरों पर बहुत साहित्य है:
और वे कैसे समस्याग्रस्त हैं:
अमूर्त के लिए। कम से कम, एक ही धागे पर, एक ही डेटा के साथ एक ही संचालन, एक ही क्रम में हो रहा है, निर्धारक होना चाहिए। इस प्रकार, हम इनपुट के बारे में चिंता करके, और फिर से शुरू कर सकते हैं।
एक ऐसा इनपुट जो समस्याओं का कारण बनता है वह है समय।
सबसे पहले, आपको हमेशा उसी टाइमस्टेप की गणना करनी चाहिए। मैं समय को मापने के लिए नहीं कह रहा हूं, मैं कह रहा हूं कि आप भौतिकी सिमुलेशन के लिए समय नहीं देंगे, क्योंकि समय में बदलाव सिमुलेशन में शोर का एक स्रोत है।
यदि आप इसे भौतिकी सिमुलेशन में नहीं दे रहे हैं तो आप समय क्यों मापते हैं? आप यह जानने के लिए बीता हुआ समय मापना चाहते हैं कि एक सिमुलेशन कदम कब बुलाया जाना चाहिए, और - यह मानते हुए कि आप नींद का उपयोग कर रहे हैं - सोने का कितना समय।
इस प्रकार:
- उपाय समय: हाँ
- सिमुलेशन में समय का उपयोग करें: नहीं
अब, निर्देश पुन: व्यवस्थित करना।
संकलक तय कर सकता है कि f * a + b
जैसा है b + f * a
, वैसे ही एक अलग परिणाम हो सकता है। यह भी fammd को संकलित कर सकता है , या यह कई लाइनें ले सकता है जैसे कि एक साथ होता है और उन्हें SIMD के साथ लिखता है , या कुछ अन्य अनुकूलन जो मैं अभी नहीं सोच सकता। और याद रखें कि हम उसी ऑपरेशन को उसी ऑर्डर पर करना चाहते हैं, यह इस कारण से आता है कि हम यह नियंत्रित करना चाहते हैं कि क्या ऑपरेशन होते हैं।
और नहीं, डबल का उपयोग करने से आप नहीं बचेंगे।
आपको संकलक और इसके कॉन्फ़िगरेशन के बारे में चिंता करने की ज़रूरत है, विशेष रूप से पूरे नेटवर्क में फ्लोटिंग पॉइंट नंबरों को सिंक्रनाइज़ करने के लिए। आपको एक ही काम करने के लिए सहमत होने के लिए बिल्ड-अप प्राप्त करने की आवश्यकता है।
यकीनन, विधानसभा लिखना आदर्श होगा। इस तरह से आप तय करते हैं कि क्या करना है। हालाँकि, यह कई प्लेटफार्मों का समर्थन करने के लिए एक समस्या हो सकती है।
इस प्रकार:
निश्चित बिंदु संख्याओं के लिए मामला
स्मृति में जिस तरह से झांकियों का प्रतिनिधित्व किया जाता है, उसके कारण बड़े मूल्य सटीक खोते जा रहे हैं। यह इस कारण से आता है कि आपके मूल्यों को छोटा (क्लैंप) रखना समस्या को कम करता है। इस प्रकार, कोई विशाल गति और कोई बड़ा कमरा नहीं। जिसका अर्थ यह भी है कि आप असतत भौतिकी का उपयोग कर सकते हैं क्योंकि आपके पास सुरंग बनाने का जोखिम कम है।
दूसरी ओर, छोटी त्रुटियां जमा होंगी। इसलिए, काट-छाँट करें। मेरा मतलब है, पैमाने और एक पूर्णांक प्रकार के लिए डाली। इस तरह आप जानते हैं कि कुछ भी नहीं बन रहा है। ऐसे ऑपरेशन होंगे जो आप पूर्णांक प्रकार के साथ रह सकते हैं। जब आपको फ़्लोटिंग पॉइंट पर वापस जाने की आवश्यकता होती है तो आप स्केलिंग और कास्ट को पूर्ववत करते हैं।
ध्यान दें मैं पैमाने कहता हूं। विचार यह है कि 1 इकाई वास्तव में दो की शक्ति (उदाहरण के लिए 16384) के रूप में दर्शाई जाएगी। जो कुछ भी है, उसे स्थिर बनाइए और उसका उपयोग कीजिए। आप मूल रूप से इसे निश्चित बिंदु संख्या के रूप में उपयोग कर रहे हैं। वास्तव में, यदि आप कुछ विश्वसनीय लाइब्रेरी से उचित फिक्स्ड पॉइंट नंबर का उपयोग कर सकते हैं तो बेहतर होगा।
मैं ट्रंकटेट कह रहा हूं। गोलाई की समस्या के बारे में, इसका मतलब है कि कलाकारों के बाद आपको जो भी मूल्य मिला है उसके अंतिम बिट पर भरोसा नहीं कर सकते। तो, कास्ट स्केल से पहले आप की जरूरत से एक बिट अधिक पाने के लिए, और बाद में इसे छोटा करें।
इस प्रकार:
- मान छोटा रखें: हाँ
- सावधान गोलाई: हाँ
- संभव होने पर फिक्स्ड प्वाइंट नंबर: हां
रुको, आपको फ़्लोटिंग पॉइंट की आवश्यकता क्यों है? क्या आप केवल पूर्णांक प्रकार के साथ काम नहीं कर सकते थे? अरे हाँ। त्रिकोणमिति और मूलाधार। आप त्रिकोणमिति और रेडिएशन के लिए तालिकाओं की गणना कर सकते हैं और उन्हें अपने स्रोत में बेक कर सकते हैं। या आप इसके बजाय निश्चित बिंदु संख्याओं का उपयोग करके, अस्थायी बिंदु संख्या के साथ गणना करने के लिए उपयोग किए गए एल्गोरिदम को लागू कर सकते हैं। हां, आपको मेमोरी, प्रदर्शन और सटीक संतुलन की आवश्यकता है। फिर भी, आप फ्लोटिंग पॉइंट नंबरों से बाहर रह सकते हैं, और निर्धारक बने रह सकते हैं।
क्या आप जानते हैं कि उन्होंने मूल प्लेस्टेशन के लिए सामान किया था? कृपया मेरे कुत्ते मिलिए, पैच ।
वैसे, मैं ग्राफिक्स के लिए फ्लोटिंग पॉइंट का उपयोग नहीं करने के लिए नहीं कह रहा हूं। सिर्फ भौतिकी के लिए। मेरा मतलब है, निश्चित रूप से, स्थिति भौतिकी पर निर्भर करेगी। हालाँकि, जैसा कि आप जानते हैं कि एक कोलाइडर को एक मॉडल से मेल नहीं खाता है। हम मॉडलों के ट्रंकेशन के परिणामों को नहीं देखना चाहते हैं।
इस प्रकार: USE FIXED POINT NUMBERS।
स्पष्ट होने के लिए, यदि आप एक संकलक का उपयोग कर सकते हैं जो आपको निर्दिष्ट करता है कि फ़्लोटिंग पॉइंट कैसे काम करता है, और यह आपके लिए पर्याप्त है, तो आप ऐसा कर सकते हैं। यह हमेशा एक विकल्प नहीं है। इसके अलावा, हम यह नियतत्ववाद के लिए कर रहे हैं। निश्चित बिंदु संख्या का मतलब यह नहीं है कि कोई त्रुटि नहीं है, आखिरकार उनके पास सीमित परिशुद्धता है।
मुझे नहीं लगता कि "निश्चित बिंदु संख्या कठिन है" उनका उपयोग न करने का एक अच्छा कारण है। और यदि आप उनका उपयोग करने का एक अच्छा कारण चाहते हैं, तो यह नियतात्मकता है, विशेष रूप से प्लेटफार्मों में निर्धारकवाद।
यह सभी देखें:
परिशिष्ट : मैं दुनिया के आकार को छोटा रखने का सुझाव दे रहा हूं। उस ने कहा, दोनों ओपी ans Jibb स्मार्ट इस बिंदु को लाते हैं कि मूल फ़्लोट से दूर जाने से कम सटीकता होती है। इसका भौतिकी पर प्रभाव पड़ेगा, जो कि दुनिया के किनारे से बहुत पहले दिखाई देगा। निश्चित बिंदु संख्या, अच्छी तरह से, निश्चित परिशुद्धता है, वे हर जगह समान रूप से अच्छे (या खराब, यदि आप चाहें) होंगे। अगर हम दृढ़ संकल्प चाहते हैं तो अच्छा है। मैं यह भी उल्लेख करना चाहता हूं कि जिस तरह से हम आमतौर पर भौतिकी करते हैं, उसमें छोटे बदलाव को बढ़ाने की संपत्ति होती है। तितली प्रभाव देखें - अतुल्य मशीन और गर्भनिरोधक निर्माता में नियतात्मक भौतिकी ।
भौतिकी करने का दूसरा तरीका
मैं सोच रहा था, यही कारण है कि फ्लोटिंग पॉइंट नंबरों में परिशुद्धता में छोटी सी त्रुटि बढ़ जाती है क्योंकि हम उन नंबरों पर पुनरावृत्तियों कर रहे हैं। प्रत्येक सिमुलेशन कदम हम अंतिम सिमुलेशन कदम के परिणाम लेते हैं और उन पर सामान करते हैं। त्रुटियों की गति को संचित करना। वह तुम्हारा तितली प्रभाव है।
मुझे नहीं लगता कि हम एक ही मशीन का उपयोग करके एक ही निर्माण को एक ही इनपुट पर एक ही इनपुट से अलग आउटपुट देंगे। फिर भी, एक अन्य मशीन पर यह या एक अलग निर्माण कर सकता है।
वहां परीक्षण के लिए एक तर्क है। यदि हम ठीक से तय करते हैं कि चीजों को कैसे काम करना चाहिए, और हम लक्ष्य हार्डवेयर पर परीक्षण कर सकते हैं, तो हमें उन बिल्ड को नहीं लगाना चाहिए जिनका एक अलग व्यवहार है।
हालाँकि, दूर काम न करने का एक तर्क यह भी है कि इसमें बहुत सारी त्रुटियाँ हैं। शायद यह एक अलग तरीके से भौतिकी करने का अवसर है।
जैसा कि आप जानते हैं, निरंतर और असतत भौतिकी है, दोनों काम करते हैं कि प्रत्येक वस्तु टाइमस्टेप पर कितना आगे बढ़ेगी। हालांकि, निरंतर भौतिकी के पास विभिन्न संभावित उदाहरणों की जांच करने के बजाय टकराव की स्थिति का पता लगाने के साधन हैं ताकि यह देखा जा सके कि टक्कर हुई थी या नहीं।
इस प्रकार, मैं निम्नलिखित का प्रस्ताव कर रहा हूं: निरंतर भौतिकी की तकनीकों का उपयोग यह पता लगाने के लिए कि प्रत्येक वस्तु की अगली टक्कर कब होगी, एक बड़े टाइमस्टेप के साथ, बहुत बड़ा कि एक एकल सिमुलेशन चरण में से एक। फिर आप निकटतम टकराव को तुरंत लेते हैं और यह पता लगाते हैं कि उस पल में सब कुछ कहां होगा।
हाँ, यह एक एकल सिमुलेशन कदम का एक बहुत काम है। इसका मतलब है कि सिमुलेशन तुरंत शुरू नहीं होगा ...
... हालाँकि, आप हर बार टकराव की जाँच किए बिना अगले कुछ सिमुलेशन चरणों का अनुकरण कर सकते हैं, क्योंकि आप पहले से ही जानते हैं कि अगली टक्कर कब होगी (या बड़े समय में कोई टक्कर नहीं होती है)। इसके अलावा, उस सिमुलेशन में संचित त्रुटियां अप्रासंगिक हैं क्योंकि एक बार जब सिमुलेशन बड़े टाइमस्टेप पर पहुंच जाता है, तो हम केवल उन पदों को रखते हैं जिन्हें हमने पहले से गणना की थी।
अब, हम उस समय के बजट का उपयोग कर सकते हैं जिसका उपयोग हम टकराव की जाँच करने के लिए करते थे, जो कि हमने पाया था उसके बाद अगली टक्कर की गणना करने के लिए प्रत्येक सिमुलेशन कदम। यही कारण है कि हम बड़े टाइमस्टेप का उपयोग करके आगे अनुकरण कर सकते हैं। एक दुनिया को दायरे में सीमित मानते हुए (यह विशाल खेलों के लिए काम नहीं करेगा), सिमुलेशन के लिए भविष्य की अवस्थाओं की एक कतार होनी चाहिए, और फिर प्रत्येक फ्रेम जिसे आप अंतिम अवस्था से अगले एक तक प्रक्षेपित करते हैं।
मैं प्रक्षेप के लिए तर्क दूंगा। हालाँकि, यह देखते हुए कि त्वराएँ हैं, हम सब कुछ उसी तरह नहीं कर सकते हैं। इसके बजाय हमें प्रत्येक वस्तु के त्वरण को ध्यान में रखना चाहिए। उस मामले के लिए हम स्थिति को केवल उसी तरह अपडेट कर सकते हैं जैसे हम बड़े टाइमस्टेप के लिए करते हैं (जिसका अर्थ यह भी है कि यह कम त्रुटि वाला है क्योंकि हम एक ही आंदोलन के लिए दो अलग-अलग कार्यान्वयन का उपयोग नहीं करेंगे)।
नोट : यदि हम इस फ्लोटिंग पॉइंट संख्या को कर रहे हैं, तो यह दृष्टिकोण वस्तुओं की समस्या को हल नहीं करता है जो कि उनके द्वारा की गई उत्पत्ति से अलग है। हालांकि, जबकि यह सच है कि सटीकता आगे खो जाती है आप मूल से दूर जाते हैं, यह अभी भी निर्धारक है। वास्तव में, यही कारण है कि मूल रूप से भी नहीं लाया।
परिशिष्ट
टिप्पणी में ओपी से :
यह विचार है कि खिलाड़ी अपनी मशीनों को किसी न किसी प्रारूप (जैसे xml या json) में सहेज पाएंगे, ताकि प्रत्येक टुकड़े की स्थिति और घुमाव दर्ज हो। उसके बाद किसी अन्य खिलाड़ी के कंप्यूटर पर मशीन को पुन: पेश करने के लिए xml या json फाइल का उपयोग किया जाएगा।
तो, कोई द्विआधारी प्रारूप, सही? इसका मतलब है कि हमें चिंता करने की भी जरूरत है कि फ्लोटिंग पॉइंट नंबरों को रिकवर किया जाए या नहीं। देखें: फ्लोट प्रिसिजन रिविजिटेड: नाइन डिजिट फ्लोट पोर्टेबिलिटी