माइक्रोकंट्रोलर पर निश्चित बिंदु अंकगणित


12

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

जब भी मैं ऐसा करता हूं, मैं सिर्फ एक पूर्णांक का उपयोग करता हूं, और याद रखता हूं कि दशमलव स्थान कहां है। हालांकि, यह सुनिश्चित करने के लिए कुछ ध्यान रखा जाता है कि सब कुछ सुसंगत है, खासकर जब गणना में चर शामिल होते हैं जहां दशमलव बिंदु एक अलग स्थान पर होता है।

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

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


1
मुझे लगता है कि यह वास्तव में स्टैकओवरफ्लो के लिए बेहतर है क्योंकि समाधान जेनेरिक की तरह है और रोबोटिक्स के साथ बहुत अधिक नहीं है।
शाहबाज़

1
@ जाकोब - ध्यान दें कि उन दोनों प्रश्नों को रचनात्मक के रूप में बंद कर दिया गया था।
मार्क बूथ

1
यह उस तरह का है जो एम्बेडेड सिस्टम के लिए C ++ को बहुत उपयोगी बना देगा। टेम्पलेट्स स्वचालित रूप से सही और इष्टतम कोड उत्पन्न करेंगे।
रॉकेटमग्नेट

1
क्या मैं आपके एटैन फंक्शन पर एक नज़र डाल सकता हूँ? मैं अपने अकादमिक शोध में फ़्लोटिंग-टू-पॉइंट-पॉइंट रूपांतरण समस्या से निपटने की कोशिश कर रहा हूं और मुझे इस पर एक दरार लेने में खुशी होगी।
जो हस

1
Arduino के @ronalchn Parts (एक AVR माइक्रो) भाषा C ++ में कार्यान्वित की जाती है। एक AVR C ++ लाइब्रेरी भी है । और यह धागा जिस पर उपयोग करने के लिए मजबूर करता है।
एम्बेडेड

जवाबों:


7

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

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


C ++ टेम्प्लेट का उपयोग करके ऐसा करना लगभग निश्चित रूप से संभव है।
रॉकेट

मैं वास्तव में आपकी तरह कुछ काम कर रहा हूं "अगर यह अच्छा होगा ..." टिप्पणी। यह gcc का एक प्लगइन है जो फ्लोटिंग-पॉइंट C कोड को फिक्स्ड-पॉइंट में परिवर्तित करता है, जो सभी बाइनरी पॉइंट स्थानों को रास्ते में अनुकूलित करता है। मेरे पास एक एसीएम जर्नल में सबमिट किया गया पेपर है, और दूसरी तैयारी में। यदि आपके पास atan फ़ंक्शन के लिए C कोड है, तो मुझे यह शॉट देने में खुशी होगी ... मैं आपको C कोड वापस दे सकता हूं जो पूर्णांक चर का उपयोग करता है और सभी निश्चित बिंदु वाले सामान का उपयोग करता है।
जो हस

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

1
@Rocketmagnet यह निश्चित रूप से टेम्पलेट्स का उपयोग करके निश्चित बिंदुओं को लागू करना संभव है, देखें फिक्स्ड पॉइंट्स (अस्वीकरण: मैंने इसे लिखा था, और यह अभी भी बहुत 'युवा' है)।
छपरा

gcc लिंक "a" टूट गया है
Lesto

2

मैंने उनके निश्चित-बिंदु DSPs पर वर्चुअल फ़्लोटिंग पॉइंट को लागू करने के लिए TI IQMath लाइब्रेरी का उपयोग किया है ।

टेक्सास इंस्ट्रूमेंट्स TMS320C28x IQmath लाइब्रेरी CMS / C ++ प्रोग्रामर के लिए अत्यधिक अनुकूलित और उच्च परिशुद्धता गणितीय कार्यों का संग्रह है जो TMS320C28x उपकरणों पर फिक्स्ड पॉइंट कोड में फ्लोटिंग-पॉइंट एल्गोरिथम को पोर्ट कर सकता है। ये रूटीन आमतौर पर कम्प्यूटेशनल रूप से गहन वास्तविक समय अनुप्रयोगों में उपयोग किए जाते हैं जहां इष्टतम निष्पादन की गति और उच्च सटीकता महत्वपूर्ण होती है। इन दिनचर्या का उपयोग करके आप मानक एएनएसआई सी भाषा में लिखे गए समकक्ष कोड की तुलना में निष्पादन की गति को काफी तेज कर सकते हैं। इसके अलावा, रेडी-यूज़ उच्च परिशुद्धता फ़ंक्शन प्रदान करके, TI IQmath लाइब्रेरी आपके DSP अनुप्रयोग विकास समय को काफी कम कर सकती है।

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


@downvoter मेरे जवाब में क्या गलत था इस पर टिप्पणी करने के लिए?
एम्बेडेड

+1: यह लाइब्रेरी अभी जो वह उपयोग कर रही है, उससे बेहतर है ("बस एक पूर्णांक का उपयोग करें")। यह सब कुछ नहीं करता है जो मूल प्रश्न के लिए पूछा गया था, लेकिन मुझे लगता है कि इस तरह का उत्तर (उपयोगी, लेकिन पूर्ण समाधान नहीं) एक मूल्य के लायक नहीं है - जब तक कि पूर्ण समाधान वास्तव में मौजूद न हो (जो मुझे इस मामले में संदेह है )।
डेविड कैरी

यह मुझे लगता है कि एक उत्तर जो उपकरणों की एक श्रृंखला के लिए विशिष्ट है और केवल बीयर के रूप में मुफ्त है, बजाय भाषण के भविष्य के आगंतुकों के लिए सीमित उपयोग का है।
मार्क बूथ

@MarkBooth मैंने C28x लाइब्रेरी से C64x लाइब्रेरी का लिंक बदल दिया। यदि आप उस लिंक का अनुसरण करते हैं, तो आप स्रोत कोड का अनुरोध कर सकते हैं। एक्सेस प्राप्त करने के लिए आपको एक कंपनी या विश्वविद्यालय के ईमेल की आवश्यकता होती है। फिर भी बीयर और भाषण में मुफ्त । आपको केवल अपना हाथ बढ़ाने और बात करने से पहले फोन करने की आवश्यकता है। थोड़ा परेशान, लेकिन एक बार जब आपके पास स्रोत कोड होता है, तो इसे आपके द्वारा पसंद किए जाने वाले किसी भी प्रोसेसर के लिए अनुकूलित किया जा सकता है।
एम्बेडेड

धन्यवाद @ embed.kyle स्रोत कोड निश्चित रूप से केवल बाइनरी की तुलना में बेहतर है, लेकिन अभी भी थोड़ा सामान्य उपयोग है यदि लाइसेंस केवल आपको सीमित तरीकों से इसका उपयोग करने की अनुमति देता है। C6x सॉफ्टवेयर लाइब्रेरीज़ पेज के अनुसार वह स्रोत केवल TI कमर्शियल लाइसेंस के तहत जारी किया गया है , जो लगभग निश्चित रूप से भाषण में मुफ्त नहीं है ।
मार्क बूथ

1

बाइनरी स्केलिंग (उर्फ बी-स्केलिंग) के कई कार्यान्वयन हैं (कोई पुस्तकालय जो मुझे तुरंत पता है )

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

मैंने रक्षा परियोजनाओं पर असेंबलर में बी-स्केलिंग का उपयोग किया है, यहां तक ​​कि सबसे छोटे सीपीयू पर भी ताकि किसी भी चीज के लिए इसकी उपयुक्तता के लिए वाउच किया जा सके ...


संभवतः ऐसा कुछ है, लेकिन मैंने इसे बी-स्केलिंग के रूप में संदर्भित कभी नहीं देखा है। मुझे लगता है कि इसे निश्चित बिंदु के रूप में देखा जाता है - दशमलव कभी भी तैरता नहीं है क्योंकि भले ही दशमलव बिंदु गणना के पाठ्यक्रम में बदल सकता है, किसी भी एक चर में हमेशा एक विशेष स्थान पर दशमलव बिंदु निर्धारित होता है
ronalchn

0

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

atancosππ

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

struct num
{
    uint16_t number;
    uint16_t decimal_point;
};

जहां numberपूरी संख्या है और decimal_pointकहते हैं कि दशमलव बिंदु कहां है, आप इसे इस तरह स्टोर कर सकते हैं:

struct num
{
    uint16_t integer;
    uint16_t fraction;
};

जहां पूरी संख्या है integer.fraction, जिसमें समान मेमोरी उपयोग, उच्च श्रेणी के मान और उपयोग करने के लिए सामान्य सरल है।


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

मेरा मतलब है कि एक चर में संग्रहीत के रूप में याद नहीं है, मेरा मतलब है कि मुझे याद है कि मुझे याद है कि परिणाम की व्याख्या कैसे करें (यह जानते हुए कि दशमलव बिंदु कहाँ है)
ronalchn

@ क्रॉनिकल, मैं देख रहा हूं। आप एक #defineसही के साथ कुछ मतलब था ? मैंने सोचा था कि आप वास्तव में इसे स्टोर करते हैं और यह इस आधार पर भिन्न हो सकता है कि आपकी संख्या कितनी बड़ी या छोटी है।
शाहबाज

@ क्रॉनिकल - क्या आप बी-स्केलिंग के बारे में सोच रहे हैं? (मेरा उत्तर देखें)
एंड्रयू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.