2010-09-11 90 views
18

फ़्लोटिंग पॉइंट प्रकार अलग-अलग बाइनरी शब्दों पर अलग-अलग अंकों और उसके एक्सपोनेंट को अलग-अलग स्टोर करके एक संख्या का प्रतिनिधित्व करता है, इसलिए यह 16, 32, 64 या 128 बिट्स में फिट बैठता है। 2 शब्द, एक, पूर्णांक भाग का प्रतिनिधित्व एक और नकारात्मक घातांक में, मूलांक पिछले भाग का प्रतिनिधित्व करने, 2^-1, 2^-2, 2^-3, आदिफ़्लोटिंग पॉइंट बनाम निश्चित बिंदु: पेशेवर/विपक्ष क्या हैं?

साथ

फिक्स्ड बिंदु प्रकार भंडार संख्या

फ्लोट बेहतर है क्योंकि उनके पास एक एक्सपोनेंट अर्थ में व्यापक सीमा है, लेकिन यदि कोई निश्चित सीमा के लिए अधिक सटीकता के साथ संख्या को स्टोर करना चाहता है, उदाहरण के लिए केवल -16 से 16 तक पूर्णांक का उपयोग करके, इस प्रकार अंक को पिछले रखने के लिए अधिक बिट्स का उपयोग करना रेडिक्स

प्रदर्शन के संदर्भ में, किसके पास सबसे अच्छा प्रदर्शन है, या ऐसे मामले हैं जहां कुछ दूसरे की तुलना में तेज़ हैं?

वीडियो गेम प्रोग्रामिंग में, क्या हर कोई फ़्लोटिंग पॉइंट का उपयोग करता है क्योंकि एफपीयू इसे तेज बनाता है, या क्योंकि प्रदर्शन ड्रॉप केवल नगण्य है, या क्या वे अपना स्वयं का निश्चित प्रकार बनाते हैं?

सी/सी ++ में कोई निश्चित प्रकार क्यों नहीं है?

+2

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

+2

आपकी समझ कैसे तय-बिंदु संख्याओं का प्रतिनिधित्व किया जाता है गलत है। –

+0

@oli: अरे! मैं इसे खो रहा हूँ! – jokoon

उत्तर

5

उस परिभाषा में निश्चित बिंदु कार्यान्वयन के बहुत सीमित सबसेट शामिल हैं।

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

  • 64 बिट अपूर्णांश, 2 -32
  • 64 बिट अपूर्णांश, 2 से बढ़ाया (इस सवाल में सूचीबद्ध परिभाषा फिट बैठता है) द्वारा बढ़ाया: उदाहरण के लिए, निम्न में से सभी "नियत बिन्दु" कर रहे हैं -33
  • 32 बिट अपूर्णांश, 2 द्वारा बढ़ाया (अब पूर्णांक और आंशिक भागों ओकटेट सीमा से अलग नहीं किया जा सकता है)
  • 32 बिट अपूर्णांश, 2 से बढ़ाया (अब वहाँ कोई आंशिक हिस्सा है) -40 (अब वहाँ कोई पूर्णांक हिस्सा है)

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

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

+1

रुको, आजकल अधिकांश GPU फ़्लोटिंग-पॉइंट नहीं हैं? –

+2

एक पूर्णांक और एक वास्तविक फिक्स्ड-पॉइंट प्रकार के बीच का अंतर यह है कि पूर्णांक का उपयोग करके निश्चित बिंदु करते समय आपको एकाधिक या विभाजन ऑपरेशन के बाद परिणाम को स्थानांतरित करना होता है। एक अंतर्निहित निश्चित प्रकार हुड के नीचे ऐसा करेगा। फिक्स्ड-पॉइंट डीएसपी हार्डवेयर पर, यह सीधे निर्देश सेट द्वारा समर्थित है, लेकिन अन्य बुद्धिमान अगर फिक्स्ड-पॉइंट * और/ऑपरेशंस को सादे पूर्णांक ऑपरेटरों से धीमा कर देता है। – Clifford

+0

@ ओली: डायरेक्टएक्स 9 के बाद से वे हैं; यह डायरेक्टएक्स 9 विनिर्देश का हिस्सा है। – Clifford

1

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

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

+0

असल में, पूर्णांक गणित सबसे तेज़ नहीं है। पूर्णांक एएलयू, एफपीयू, और सिमड इकाई में काम फैलाना सबसे तेज़ है, लेकिन जाहिर है कि यह अधिक जटिल है। –

+0

@ बेन: सच है, लेकिन यह इस प्रश्न के दायरे से बाहर है। –

4

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

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

सी या सी ++ में कोई अंतर्निहित निश्चित बिंदु प्रकार नहीं है, क्योंकि मैं कल्पना करता हूं क्योंकि वे (या कम से कम सी) सिस्टम स्तर की भाषाओं के रूप में विचार किए गए थे और आवश्यकता निश्चित बिंदु कुछ हद तक डोमेन विशिष्ट है, और शायद सामान्य पर उद्देश्य प्रोसेसर आमतौर पर निश्चित बिंदु के लिए कोई प्रत्यक्ष हार्डवेयर समर्थन नहीं है।

सी ++ में उपयुक्त ऑपरेटर ओवरलोड और संबंधित गणित फ़ंक्शंस के साथ एक निश्चित-बिंदु डेटा प्रकार वर्ग को परिभाषित करने से आसानी से इस शॉर्टकॉम को दूर किया जा सकता है। हालांकि इस समस्या के अच्छे और बुरे समाधान हैं। अच्छा उदाहरण यहां पाया जा सकता है: http://www.drdobbs.com/cpp/207000448। उस आलेख में कोड का लिंक टूटा हुआ है, लेकिन मैंने इसे ftp://66.77.27.238/sourcecode/ddj/2008/0804.zip

+0

स्रोत कोड का आपका लिंक भी टूटा हुआ है (कम से कम इसे लिखने के समय), लेकिन मैंने इसे उस कंपनी की साइट पर भी ढूंढने में कामयाब रहा है जिसका मूल लेखक काम करता है: http: //www.justsoftwaresolutions। co.uk/files/fixed_source.zip – Gavin

+0

ध्यान दें कि मुझे लॉग() फ़ंक्शन में एक बग मिली है, लुक-अप टेबल में से एक एक मान से छोटा था। यह लेखक द्वारा सत्यापित किया गया था, लेकिन ऐसा लगता है कि इन फ़ाइलों को अद्यतन नहीं किया गया है। जब मैं इसे खोद सकता हूं तो मैं सुधार के विवरण पोस्ट करूंगा। – Clifford

1

पर ट्रैक किया है, इस संदर्भ में "सटीकता" पर चर्चा करते समय आपको सावधान रहना होगा।

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

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

और इसी तरह।

4

कोड स्तर पर, निश्चित-बिंदु अंकगणित एक अंतर्निहित denominator के साथ बस पूर्णांक अंकगणित है।

कई सरल अंकगणितीय परिचालनों के लिए, निश्चित बिंदु और पूर्णांक संचालन अनिवार्य रूप से वही हैं। हालांकि, कुछ ऐसे ऑपरेशन हैं जो इंटरमीडिएट मानों को उच्चतम बिट्स के साथ प्रदर्शित किया जाना चाहिए और फिर गोलाकार होना चाहिए। उदाहरण के लिए, दो 16-बिट निश्चित-बिंदु संख्याओं को गुणा करने के लिए, परिणाम को 16-बिट निश्चित बिंदु पर पुनर्निर्मित करने (या संतृप्त) से पहले अस्थायी रूप से 32-बिट में अस्थायी रूप से संग्रहीत किया जाना चाहिए।

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

कुछ आर्किटेक्चर, कुछ गणित कार्यों के लिए हार्डवेयर कार्यान्वयन प्रदान ऐसे sin, cos, atan, sqrt के रूप में, फ्लोटिंग प्वाइंट प्रकार के लिए ही। कुछ आर्किटेक्चर बिल्कुल हार्डवेयर कार्यान्वयन प्रदान नहीं करते हैं। दोनों मामलों में, विशेष गणित सॉफ्टवेयर पुस्तकालय उन कार्यों को केवल पूर्णांक या निश्चित-बिंदु अंकगणित का उपयोग कर प्रदान कर सकते हैं। अक्सर, इस तरह के पुस्तकालय कई स्तरों के सटीक प्रदान करेंगे, उदाहरण के लिए, उत्तर जो सटीकता के एन-बिट्स तक सटीक हैं, जो प्रतिनिधित्व की पूर्ण परिशुद्धता से कम है। सीमित-सटीक संस्करण उच्चतम-सटीक संस्करण की तुलना में तेज़ हो सकते हैं।

1

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

उदाहरण के लिए आप स्क्रीन/व्यूपोर्ट की चौड़ाई 0.0 से 1.0 के रूप में परिभाषित कर सकते हैं, स्क्रीन 0.0 से 1.0 की ऊंचाई। 0.0 से 1.0 शब्द की गहराई। और इसी तरह। मैट्रिक्स गणित, आदि चीजों को लागू करने में आसान बनाता है। उस गणित को उस बिंदु तक करें जहां आपको वास्तविक स्क्रीन आकार पर असली पिक्सल की गणना करने की आवश्यकता है, 800x400 कहें। दुनिया में ऑब्जेक्ट पर आंख से बिंदु तक परियोजना को प्रोजेक्ट करें और गणना करें कि यह 0 से 1 गणित का उपयोग करके स्क्रीन को छेद करती है, फिर 800 से x, y बार 400 गुणा करें और उस पिक्सेल को रखें।

फ़्लोटिंग पॉइंट एक्सपोनेंट और मंटिसा को अलग से स्टोर नहीं करता है और मंटिसा एक मूर्खतापूर्ण संख्या है, जो एक्सपोनेंट और साइन के बाद छोड़ दिया जाता है, जैसे 23 बिट्स, 16 या 32 या 64 बिट्स नहीं।

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

0

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

+0

मुझे आश्चर्य है कि क्या आप फ्लोटिंग और फिक्स्ड पॉइंट एल्गोरिदम के बीच आसानी से पोर्ट किए जाने के लिए सॉफ़्टवेयर डिज़ाइन कर सकते हैं। अब तक मुझे नहीं लगता कि यह आसान होगा ... – jokoon

+0

असल में यह बहुत आसान है। आपको ज्यादातर मामलों में 'typedef int32 fixed' और '# परिभाषित एमयूएल (ए, बी) ((int32) ((int64) (ए) * (बी)) >> radix)' और आप जाने के लिए तैयार हैं। –

0

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

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

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

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