फ्लोटिंग पॉइंट प्रिसिजन के बारे में और हम अभी भी इसका इस्तेमाल क्यों करते हैं


38

फ्लोटिंग पॉइंट हमेशा बड़ी दुनिया पर सटीक के लिए परेशानी भरा रहा है।

यह लेख पीछे के दृश्यों की व्याख्या करता है और स्पष्ट वैकल्पिक - निश्चित बिंदु संख्या प्रदान करता है। कुछ तथ्य वास्तव में प्रभावशाली हैं, जैसे:

"सुक्ष्ममापी परिशुद्धता के साथ सूर्य से (7.4 बिलियन किमी) प्लूटो की सबसे दूर की दूरी पर अच्छी तरह से सटीकता के 64 बिट्स मिलते हैं।"

अच्छी तरह से उप-माइक्रोमीटर परिशुद्धता किसी भी एफपीएस की जरूरत (पदों और यहां तक ​​कि वेग के लिए) की तुलना में अधिक है, और यह आपको वास्तविक दुनिया बनाने में सक्षम करेगा।

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

क्या वे इतने धीमे हैं?

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


3
अंतिम "अतिरिक्त" बिट को शायद एक अलग प्रश्न होना चाहिए, ताकि मुख्य को अलग न किया जाए।
टेट्राद

मैं यह तय करना चाहता हूं कि निश्चित बिंदु को कैसे बाध्य किया जाए ... मेरे खेल में सभी प्रकार की अजीब त्रुटियां हैं क्योंकि लुआ एफपीयू का उपयोग करता है, और एफपीयू के साथ डायरेक्टएक्स फ़िडल्स भी ... मैंने 2 * 9000 = 17995 या 500 * 10 जैसी चीजें देखी हैं। = 4897 यह वास्तव में मूर्खतापूर्ण है। लेकिन सबसे बुरी त्रुटि शायद एक है कि Ogre3D मंचों में चर्चा की है, जहां 1 + 5 = 4 है
speeder

3
एक टिप्पणी का औचित्य नहीं; लेकिन अगर आप निश्चित बिंदु Q-Floats का उपयोग करने का निर्णय लेते हैं ( en.wikipedia.org/wiki/Q_(number_format) ) आपके मित्र हैं; वे हास्यास्पद तेजी से और आसानी से लागू होते हैं।
जोनाथन डिकिंसन

तो, योग करने के लिए to क्या मुझे फ्लोटिंग पॉइंट्स के साथ रहना चाहिए (यदि मैं जावा या पायथन में काम कर रहा हूं)? - Gastón 26 मिनट पहले
Gastón

जवाबों:


20

यदि आप मुझे एक बेशर्म प्लग की अनुमति देंगे, तो मैं आपको एक वास्तविक गेम से उदाहरण दूंगा जो मैं (YouTube वीडियो लिंक) पर काम कर रहा हूं

गेम में एक भौतिकी इंजन पर एक अनंत, प्रक्रियात्मक रूप से उत्पन्न दुनिया है। यह एकल-सटीक फ़्लोटिंग पॉइंट का उपयोग करता है। कुछ सौ मीटर के खेल के स्थान के बाद, सटीक मुद्दे उठने शुरू हो जाते हैं (और आपके द्वारा प्राप्त मूल से उत्तरोत्तर बदतर हो जाते हैं)।

मेरा समाधान? प्रत्येक 200 मीटर या तो मैं पूरी दुनिया को 200 मीटर तक पीछे ले जाता हूं मूल (यदि आप मेरी साइट पर प्रोटोटाइप में से एक को खोजने और प्रयास करने के लिए परवाह करते हैं, और [w] orld डीबग ओवरले को ऊपर लाते हैं, तो आप इसे देख सकते हैं)।

निश्चित बिंदु का उपयोग क्यों नहीं? या दोहरी सटीकता? एकल-परिशुद्धता के बजाय? क्योंकि बाकी सब कुछ एकल सटीक फ्लोटिंग पॉइंट का उपयोग कर रहा है!

भौतिकी इंजन जिसका मैं उपयोग कर रहा हूं, XNA इसका उपयोग करता है, ग्राफिक्स कार्ड पर लोड होने वाले डेटा को एकल-सटीक फ़्लोटिंग पॉइंट के रूप में स्वरूपित किया जाता है। यहां तक ​​कि स्वयं भाषा को फ्लोटिंग पॉइंट नंबरों के साथ काम करने के लिए डिज़ाइन किया गया है - लेखन और (अधिक महत्वपूर्ण बात) पढ़ना इससे 0.5fकहीं अधिक आसान है 0x80000000L

यह केवल अभ्यास में आसान होने की बात है। और स्पष्ट विजेता को फ़्लोटिंग पॉइंट सटीक मुद्दों के बारे में पता चल रहा है और काफी सरल "चाल-इन-द-वर्ल्ड-बैक-टू-जीरो" फ़ंक्शन (या अंतरिक्ष विभाजन को लागू करने या जो भी आपके गेम को सूट करता है) लिख रहा है

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


मैं हमेशा सोचता था कि क्या कुछ अनुप्रयोगों के लिए सब कुछ स्थानांतरित करना और मूल में "खिलाड़ी" रखना आसान हो सकता है । यह देखने के लिए दिलचस्प है कि मैं अकेला नहीं हूँ!
डैश-टॉम-बैंग

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

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

@ जोकून मुझे लगा कि मेरा जवाब काफी स्पष्ट था। हर जगह नियत बिंदु को लागू क्यों नहीं किया जाता है? विकिपीडिया की ओर देखें: "बहुत कम कंप्यूटर भाषाओं में निश्चित बिंदु मानों के लिए अंतर्निहित समर्थन शामिल होता है, क्योंकि अधिकांश अनुप्रयोगों के लिए, बाइनरी या दशमलव फ़्लोटिंग-पॉइंट अभ्यावेदन आमतौर पर उपयोग करने के लिए सरल और पर्याप्त होते हैं ।" एक अच्छा डिजाइनर जानता है कि क्या छोड़ना है - और ऐसा कुछ जो कार्यक्षमता को इस तरह से डुप्लिकेट करता है जिससे प्रोग्रामर के लिए पैर में खुद को शूट करना वास्तव में आसान हो जाता है।
एंड्रयू रसेल

माना। आज के प्रोसेसर फ्लोटिंग पॉइंट निर्देशों को बहुत आसानी से निष्पादित करते हैं, निर्देशों में उत्कृष्ट थ्रूपुट हैं और अधिकांश पूर्णांक निर्देशों की तुलना में केवल कुछ चक्र लंबे विलंबता हैं।
doug65536

11

पहला - हां, वे काफी तेज हैं। यहां तक ​​कि अगर आप एक "सामान्य" FPU के रूप में तेजी से काम कर रहे निश्चित बिंदु प्राप्त कर सकते हैं, तो वास्तविक फ़्लोटिंग बिंदु को एक बार में कई फ़्लोट्स पर काम करने के लिए fsel जैसे ब्रांचिंग या SIMD को रोकने के लिए फायदेमंद निर्देश हैं। जीपीयू फ़्लोटिंग पॉइंट का उपयोग करते हैं, कम से कम उनके उपयोगकर्ता-सामना वाले इंटरफेस में।

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


5

बनाने के लिए एक और महत्वपूर्ण बिंदु यह है कि फ्लोट इतने गलत नहीं हैं क्योंकि यहां के लोग सोचते हैं। 32-बिट फ्लोट में पूर्ण-पूर्णांक परिशुद्धता के 24-बिट होते हैं। इसका मतलब है कि यह किसी भी सीमा के लिए कम से कम 24-बिट फिक्स्ड पॉइंट वैल्यू के रूप में सटीक है। हालांकि फ्लोट कम सटीक होते हैं जितना बड़ा मूल्य बन जाता है, एक निश्चित बिंदु मान बस बह जाएगा और कुछ बिंदु पर चारों ओर लपेट जाएगा। सटीकता कम करना बेहतर कमबैक है। झंडे भी बह सकते हैं, लेकिन बहुत दूर, बाद में। मैं आपके चेहरों को तब देखना चाहूंगा जब आपकी दुनिया अचानक बिंदु के अतिप्रवाह के कारण -2 ^ 31 के आसपास हो जाए।

64-बिट फ्लोटिंग पॉइंट वैल्यू में पूर्णांक परिशुद्धता के 53-बिट हैं, इसलिए वे वास्तव में सटीक हैं।


फ्लोटिंग पॉइंट वैल्यू वास्तव में अतिप्रवाह नहीं है; यदि अभिकलन का परिणाम परिमाण में बहुत बड़ा है, तो इसका परिणाम सकारात्मक या नकारात्मक है।
अनानास

3

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

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

IIRC, इन्फिनिटी पर देव ने कहा कि वह अपने एक साक्षात्कार में पैमाने के मुद्दों के बारे में लगातार परेशान कर रहा था।


यह संभावना नहीं है कि किसी भी खेल में आपको फ्लोटिंग पॉइंट की सटीक "शून्य के करीब" की आवश्यकता होगी। यदि आपके पास एक मीटर इकाई है, तो 10 बिट्स की सटीकता आपको सब-मिलीमीटर सटीकता प्रदान करती है और फिर भी यदि आप 32 बिट मूल्यों के साथ फंस गए हैं, तो आपको प्रत्येक दिशा में 4000 किमी से अधिक मॉडल करने की अनुमति देता है। यदि आपको मिलीमीटर से अधिक सटीकता की आवश्यकता है तो आप कुछ और बिट्स को शिफ्ट कर सकते हैं। स्पेस गेम में 64 बिट वैल्यू में जाने से आपको पूरे वॉल्यूम में निरंतर परिशुद्धता के साथ सोलर सिस्टम (या अधिक?) मिलेगा।
डैश-टॉम-बैंग

वास्तव में। और इसीलिए आप आकाशगंगा-आकार की दुनिया में एक बिंदु के रूप में सौर मंडल के सूर्य का उपयोग करेंगे! मुद्दा यह है, परिशुद्धता को संभालने की आपकी चुनी हुई विधि किसी भी तरह से तालिका में कुछ भी नहीं लाती है। यह लूट है, इसलिए आप अपने पुस्तकालय / हार्डवेयर का उपयोग कर सकते हैं।
रशियो

संयोग से, मैंने एक ऐसे खेल पर काम किया जहां हमें प्रत्येक दिशा में 4000 किमी से अधिक मॉडलिंग करनी थी। अन्य परियोजनाओं में कोड के साथ संगतता के लिए, इसे पदों के लिए 32 बिट्स का उपयोग करना पड़ा। यह एक सैद्धांतिक समस्या नहीं है, कोड के पुन: उपयोग और आज के खेल की दुनिया के आकार पर रखी गई व्यावसायिक मांगों को देखते हुए।

1

यदि आपने अभी तक नहीं किया है, तो आपको निश्चित रूप से GameDev.net पर प्लेनेट रेंडरिंग ट्यूटोरियल की जांच करनी चाहिए । अंतरिक्ष विभाजन के लिए, एक समाधान दो अलग-अलग स्थिति चर रखने के लिए है - एक मैक्रो स्केल और एक माइक्रो स्केल। यह काफी अच्छी तरह से (परीक्षण) काम करता है।

सटीक समाधान इस बात पर निर्भर करता है कि आप इंजन में अत्यधिक दूरी को संभालने की योजना कैसे बनाते हैं - क्या आप जंप गेट्स, या समय संपीड़न की योजना बनाते हैं?


1

कारणों में से एक यह है कि फ्लोटिंग पॉइंट अंकगणित "काफी अच्छा है" (या कम से कम यह रहा है), यह जल्दी से काफी सटीक परिणाम पैदा करता है।

जब तक आप फ्लोटिंग पॉइंट अंकगणित की सीमाओं के बारे में जानते हैं और उनके साथ सामना करने के लिए अपने एल्गोरिदम को बदलते हैं (एंड्रयू रसेल का जवाब देखें) तब आप कोड का उत्पादन करेंगे जो "काम करता है"।


-1

मैं एक खेल लिख रहा हूं। अपने खेल / कार्यक्रम में, मैं एक निश्चित कैमरे का उपयोग करके मूल स्थान पर एक अंतरिक्ष यान खींचता हूं और मेरे ग्रह को मैं एक अलग कैमरे का उपयोग करके आकर्षित करता हूं। और ये दो बातें मेरे लिए समस्या का ध्यान रखती हैं, लेकिन मेरा ग्रह अभी बहुत विस्तृत नहीं है। समाधान के लिए एंड्रयू रसेल ने दुनिया को आगे बढ़ाने के बारे में उल्लेख किया (और मैं कैमरे और उसके निवासियों को मूल की ओर वापस ले जा रहा हूं) मैं वास्तव में कोशिश नहीं करूंगा कि यदि आप कभी भी गेम को एक नेटवर्क गेम बनाने की योजना बनाते हैं। यदि आप प्रत्येक क्लाइंट के मूवमेंट के आधार पर सर्वर एप्लिकेशन पर दुनिया को स्थानांतरित करते हैं, तो दुनिया एक स्थिति के लिए संघर्ष कर रही है। और हर समय खेलने वाले से अपनी स्थिति लेगा जो एक बड़ी गड़बड़ होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.