सबसे बड़ा "सापेक्ष" स्तर क्या मैं फ्लोट का उपयोग करके बना सकता हूं?


13

जैसे कि यह कालकोठरी घेराबंदी और केएसपी जैसे खेलों के साथ प्रदर्शित किया गया था, फ़्लोटिंग पॉइंट काम करने के कारण एक बड़े पर्याप्त स्तर को ग्लिच होना शुरू हो जाएगा। आप सटीकता खोए बिना 1e-20 से 1e20 नहीं जोड़ सकते।

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

जवाबों:


26

एक 32-बिट फ्लोट में 23 बिट मंटिसा है

इसका अर्थ है कि प्रत्येक संख्या को 1.xxx xxx xxx xxx xxx xxx xx के रूप में 2 की शक्ति के रूप में दर्शाया गया है, जहां प्रत्येक x एक द्विआधारी अंक है, या तो 0 या 1. है ( से कम की बेहद छोटी संख्या के अपवाद के साथ - वे 1. के बजाय 0. से शुरू करते हैं, लेकिन मैं उन्हें इस बात के लिए अनदेखा करूँगा)2126

तो और की सीमा में , आप किसी भी संख्या का प्रतिनिधित्व सटीकता के भीतर कर सकते हैं।2i2(i+1)±2(i24)

उदाहरण के लिए, , इस श्रेणी में सबसे छोटी संख्या है । अगली सबसे छोटी संख्या है । यदि आप का प्रतिनिधित्व करना चाहते हैं , तो आपको किसी भी तरह की त्रुटि के लिए ऊपर या नीचे गोल करना होगा ।i=0(20)1=1(20)(1+223)1+224224

In this range:                You get accuracy within:
-----------------------------------------------
         0.25   -     0.5    2^-26 = 1.490 116 119 384 77 E-08
         0.5    -     1      2^-25 = 2.980 232 238 769 53 E-08
         1     -      2      2^-24 = 5.960 464 477 539 06 E-08
         2     -      4      2^-23 = 1.192 092 895 507 81 E-07
         4     -      8      2^-22 = 2.384 185 791 015 62 E-07
         8     -     16      2^-21 = 4.768 371 582 031 25 E-07
        16     -     32      2^-20 = 9.536 743 164 062 5  E-07
        32     -     64      2^-19 = 1.907 348 632 812 5  E-06
        64     -    128      2^-18 = 0.000 003 814 697 265 625
       128    -     256      2^-17 = 0.000 007 629 394 531 25
       256    -     512      2^-16 = 0.000 015 258 789 062 5
       512    -   1 024      2^-15 = 0.000 030 517 578 125
     1 024    -   2 048      2^-14 = 0.000 061 035 156 25
     2 048    -   4 096      2^-13 = 0.000 122 070 312 5
     4 096    -   8 192      2^-12 = 0.000 244 140 625
     8 192   -   16 384      2^-11 = 0.000 488 281 25
    16 384   -   32 768      2^-10 = 0.000 976 562 5
    32 768   -   65 536      2^-9  = 0.001 953 125
    65 536   -  131 072      2^-8  = 0.003 906 25
   131 072   -  262 144      2^-7  = 0.007 812 5
   262 144   -  524 288      2^-6  = 0.015 625
   524 288 -  1 048 576      2^-5  = 0.031 25
 1 048 576 -  2 097 152      2^-4  = 0.062 5
 2 097 152 -  4 194 304      2^-3  = 0.125
 4 194 304 -  8 388 608      2^-2  = 0.25
 8 388 608 - 16 777 216      2^-1  = 0.5
16 777 216 - 33 554 432      2^0   = 1

इसलिए यदि आपकी इकाइयां मीटर हैं, तो आप 16 484 - 32 768 बैंड (मूल से लगभग 16-33 किमी) के आसपास मिलीमीटर परिशुद्धता खो देंगे।

यह आमतौर पर माना जाता है कि आप एक अलग आधार इकाई का उपयोग करके इसके आसपास काम कर सकते हैं, लेकिन यह वास्तव में सच नहीं है, क्योंकि यह सापेक्ष सटीकता है जो मायने रखती है।

  • यदि हम अपनी इकाई के रूप में सेंटीमीटर का उपयोग करते हैं, तो हम 1 048 576-2 097 152 बैंड (मूल से 10-21 किमी) पर मिलीमीटर परिशुद्धता खो देते हैं

  • यदि हम अपनी इकाई के रूप में हेक्टेमीटर का उपयोग करते हैं, तो हम 128-256 बैंड (मूल से 13-26 किमी) पर मिलीमीटर परिशुद्धता खो देते हैं।

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

वास्तव में आपका गेम कितना अशुद्धि सहन कर सकता है, यह आपके गेमप्ले, भौतिकी सिमुलेशन, इकाई आकार / दूरियां, रेज़ॉल्यूशन रेज़ोल्यूशन इत्यादि के विवरण पर निर्भर करेगा, इसलिए सटीक कटऑफ़ सेट करना मुश्किल है। यह हो सकता है कि आपका प्रतिपादन मूल से 50 किमी दूर ठीक लगे, लेकिन आपकी गोलियों को दीवारों के माध्यम से टेलीपोर्ट किया जा रहा है, या एक संवेदनशील गेमप्ले की स्क्रिप्ट हाबी है। या आप पा सकते हैं कि खेल ठीक चलता है, लेकिन कैमरे के बदलाव में अशुद्धियों से बमुश्किल-बोधगम्य कंपन होता है।

यदि आपको अपनी सटीकता की आवश्यकता का स्तर पता है (कहते हैं, 0.01 यूनिट की अवधि आपके विशिष्ट देखने / इंटरैक्शन दूरी पर लगभग 1 px पर मैप करती है, और कोई भी छोटा ऑफसेट अदृश्य है), तो आप उस तालिका का उपयोग कर सकते हैं जहां आप खो सकते हैं। सटीकता, और कदम वापस नुकसान के संचालन के मामले में सुरक्षा के लिए परिमाण के कुछ आदेश।

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


1
पुनरावृत्ति निश्चित रूप से जाने का रास्ता है!
फ्लोरिस

2
निर्धारित बिंदु निर्देशांक का उपयोग करने के बारे में क्या? यदि आवश्यक हो तो 64 बिट पूर्णांक के साथ हो सकता है?
एपीआई-बीस्ट

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

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

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

3

इसका उत्तर देना कठिन है क्योंकि यह आपके भौतिकी के पैमाने पर निर्भर करता है: स्वीकार्य न्यूनतम गति गति क्या है जिसे शून्य से गोल करने की आवश्यकता नहीं है?

यदि आपको एक बड़ी दुनिया और सुसंगत भौतिकी की आवश्यकता है तो निश्चित अंक वर्ग का उपयोग करना बेहतर है।

उदाहरण के लिए, दुनिया में कहीं से भी एक तोप के गोले को मारना आपको एक ही परिणाम देगा और एक 64 बिट फिक्स्ड पॉइंट (32.32) आपको अधिकांश खेलों में सटीक और अधिक से अधिक कुछ भी प्रदान करता है। यदि आपकी इकाई 1 मीटर है, तो आप अभी भी 232 पिकमीटर सटीक 2147483 किमी की दूरी पर हैं।

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

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

उन ऑपरेशनों को SIMD निर्देशों और पाइपलाइनिंग से उतना लाभ नहीं होता है जो आम तौर पर FPU विलंबता को छिपाते हैं।

आप हर चीज़ को रेंडर करने के लिए कैमरे की स्थिति को घटाकर फ़्लोटिंग पॉइंट के बाद फ़्लोटिंग पॉइंट में बदल सकते हैं, बड़ी दुनिया में फ़्लोटिंग पॉइंट के मुद्दों से बच सकते हैं और फ़्लोटिंग पॉइंट का उपयोग करके नियमित रेंडरर का उपयोग कर सकते हैं।


-3

आप इसे गुणा से पूरी तरह से बचा सकते हैं।
फ़्लोट्स के साथ काम करने के बजाय, बस उन्हें 10 ^ (x) से गुणा करें, उन्हें स्टोर करें, और जब ज़रूरत हो फिर से 10 ^ (- x) से गुणा करें।
इससे यह निर्भर करता है कि आप किस प्रकार के इंट का उपयोग करना चाहते हैं।


2
यह समस्या से बचने नहीं है। एक निश्चित-बिंदु प्रारूप में अभी भी परिमित परिशुद्धता और सीमा है - अधिक से अधिक सीमा, कम सटीकता (जहाँ आप उस निश्चित दशमलव बिंदु को लगाते हैं) के आधार पर - तो "कितना बड़ा मैं दृश्यमान गोलाई त्रुटियों के बिना एक स्तर बना सकता हूं" का निर्णय अभी भी लागू होता है।
DMGregory

3
इसके अलावा, बेस -10 बहुत व्यावहारिक नहीं है। जब आप बिट्स के संदर्भ में पूर्णांक को विभाजित करते हैं, तो फिक्स्ड-पॉइंट संख्या बहुत बेहतर होती है (अहस्ताक्षरित 26.6 पर विचार करें - आंशिक घटक निम्न 6-बिट्स ( 1.0 / 64.0 * x & 63) है और अभिन्न अंग बस x >> 6 है) । यह दस की शक्ति के लिए कुछ बढ़ाने से ज्यादा सरल है।
एंडन एम। कोलमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.