2010-03-19 9 views
16

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

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

आम तौर पर गणित coprocessors और त्वरक जावा में डबल पसंद करते हैं क्योंकि यह आंतरिक प्रकारों में से एक के अनुरूप है। क्या एंड्रॉइड के दलविक वीएम के बारे में कुछ है जो किसी कारण से फ्लोट पसंद करता है? या एपीआई डिज़ाइन में विकृति का परिणाम केवल सभी फ्लोट हैं?

+0

जब कभी भी कोई युगल शुरू नहीं होता तब फ्लोट या इनट्स को युगल में बढ़ावा दिया जाता है? – Karu

उत्तर

8

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

+1

यह देवों से सही कारण के सबसे निकटतम है। यह वास्तव में स्मृति नहीं है। एआरएम में कोई एफपीयू नहीं है, या जिनके पास 32-बिट एफपीयू है। 64-बिट युगल का अनुकरण धीमा है। –

+7

"फेडेन" (वीएम लिखने वाले लोगों में से एक) का दूसरा जवाब सबसे अच्छा जवाब है। –

+0

सुधार - आधुनिक उपकरणों पर तैरने और युगल समकक्ष हैं। –

7

उन मीट्रिक के लिए जिन्हें बहुत अधिक महत्वपूर्ण अंक (जैसे स्क्रीन ऑफ़सेट) की आवश्यकता नहीं है, यह एस के बजाय double एस का उपयोग करने के लिए स्मृति-अक्षम होगा। स्मृति उपभोग के संबंध में दक्षता को अधिकतम करना मोबाइल उपकरणों पर बेहद महत्वपूर्ण है, जहां हर संसाधन प्रीमियम पर बहुत अधिक है। और, Rect एस — जैसी वस्तुओं से निपटने पर संभावित रूप से हजारों — द्वारा आवंटित किया जा सकता है, यह अतिरिक्त बिट्स को कम करने के लिए स्पष्ट रूप से महत्वपूर्ण है।

मुझे यकीन है कि अन्य कारणों

3

अजीब देखते हैं भी :-) हूँ। गाइड में प्रदर्शन के लिए डिजाइनिंग कहती है ".... डेस्कटॉप सिस्टम पर सामान्य अभ्यास फ्लोटिंग पॉइंट का स्वतंत्र रूप से उपयोग करना है ...... इसलिए" फ्लोट "और" डबल "पर सभी ऑपरेशन सॉफ्टवेयर में किए जाते हैं ... । .... निर्देश अनावश्यक रूप से एक विशेष प्रकार के लिए सीमित नहीं हैं उदाहरण के लिए, निर्देश है कि व्याख्या के बिना 32-बिट रजिस्टर मूल्यों के लिए कदम निर्दिष्ट करने के लिए की जरूरत नहीं है: " http://developer.android.com/guide/practices/design/performance.html#avoidfloat

पर यह कुछ अर्थपूर्ण हो सकता है"। चाहे वे इनट्स या फ्लोट्स ले जा रहे हों ..... " http://www.netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html

+1

मैंने froyo के लिए "प्रदर्शन के लिए डिजाइनिंग" में से अधिकांश को फिर से लिखा है। आधुनिक उपकरणों जैसे कि Droid और Nexus One में फ़्लोटिंग पॉइंट हार्डवेयर है, जिसका अर्थ है कि फ्लोट/युगल का विभाजन वास्तव में इन्स/लम्बाई के विभाजन से तेज है (क्योंकि अभी भी कोई हार्डवेयर पूर्णांक विभाजित नहीं है)। –

+1

दल्विक बाइटकोड दस्तावेज़ में नोट निर्देश सेट और कोड सत्यापन के डिज़ाइन के संबंध में अधिक है। विचार यह है कि, आंतरिक रूप से, चाहे मैं एक "पूर्णांक निरंतर" 0 या "फ्लोट स्थिर" 0 के साथ एक रजिस्टर लोड करता हूं, अप्रासंगिक है; यह सिर्फ 32-बिट मान है। फ्लोट बनाम डबल या प्रदर्शन से वास्तव में संबंधित नहीं है। – fadden

1

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

याद रखें कि कास्टिंग का उपयोग करना आवश्यक नहीं है। बस अपने शाब्दिक में एक एफ संलग्न करें (तो 2.5 2.5f हो जाता है)। मुझे नहीं पता कि संकलक आपके लिए निम्नलिखित प्रतिस्थापन करने के लिए पर्याप्त स्मार्ट है, लेकिन यदि नहीं, तो यह आपके कोड को थोड़ा और अधिक कुशल बना देगा।

पर विचार करें

float x = (float) 2.5; 

और

float x = 2.5f; 

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

+0

क्या आप निश्चित हैं? मैंने अभी परीक्षण किया है, दोनों संस्करण समान बाइटकोड उत्पन्न करते हैं। फडेन का जवाब देखें। – Oliv

+0

@ ओलिव - फेडेन ने मेरे पीछे जवाब दिया, और मुझे लगता है कि मैंने यह स्पष्ट कर दिया है कि नहीं, मुझे यकीन नहीं था। "मुझे नहीं पता कि संकलक क्या है ..." – Jimbugs

43

एफपीयू के बिना डिवाइस पर, एकल-परिशुद्धता फ़्लोटिंग पॉइंट ऑप्स डबल-सटीक समकक्षों की तुलना में बहुत तेज़ होते हैं। इस वजह से, एंड्रॉइड फ्रेमवर्क एक फ्लोटमैथ क्लास प्रदान करता है जो कुछ java.lang.Math फ़ंक्शंस को प्रतिलिपि बनाता है, लेकिन डबल की बजाय फ्लोट तर्कों के साथ।

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

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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^