क्या पाव () के लिए एक गैर-फ्लोट विकल्प है?


9

मैंने Arduino वेब-साइट में भाषा का संदर्भ दिया है , और मुझे एक गैर-फ़्लैट नहीं मिल pow() रहा है जिसके बराबर मुझे कुछ बड़ा याद आ रहा है, लेकिन मेरे जीवन के लिए, मैं स्तब्ध हूँ! मैंने pow()गणित शीर्षक (जैसे मैं उम्मीद करूंगा) के तहत FUNCTIONS कॉलम में पाया , लेकिन यह कहता है कि दोनों पैरामीटर, [आधार] और [घातांक] दोनों (फ्लोट) हैं। और मैथ हेडिंग के तहत केवल छह अन्य प्रविष्टियाँ हैं; उनमें से कोई भी पूर्णांक संस्करण प्रतीत नहीं होता है। मैं केवल ० से १० का उपयोग करके २ की शक्तियाँ उत्पन्न करना चाहता हूँ। जैसे २ ^ ० = १ तब २ ^ १ = २ तब २ ^ २ = ४ तो २ ^ ३ = 2 फिर २ ^ ४ = १६ तब 2 ^ 5 = 32 फिर 2 ^ 6 = 64 तब 2 ^ 7 = 128 फिर 2 ^ 8 = 256 फिर 2 ^ 9 = 512 फिर 2 ^ 10 1024 है

क्या फ्लोट्स का उपयोग करना एकमात्र तरीका है जो मैं यह कर सकता हूं? मुझे ऐसा लगने लगा है कि मैं वास्तविकता के साथ हूँ, और वास्तव में मेरी दवा को गिना है, लेकिन मैं वहीं हूँ जहाँ मुझे होना चाहिए। मुझे इस अहंकारी निरीक्षण के लिए पहले से माफी मांगना चाहिए कि मैंने आपका समय बर्बाद कर दिया है, लेकिन मैंने सभी 9 पन्नों के टैग के माध्यम से जाना है और कभी भी खोज की है जो मैं सोच सकता था। मैं मानता हूँ कि मैंने बहुत समय नहीं बिताया है, लेकिन मुझे यकीन था कि यह केवल पाँच मिनट की चीज़ जैसा होगा!


2
पूर्णांक पॉव () के सामान्य मामले के लिए, stackoverflow.com/questions/101439/… देखें । 2 की शक्तियों के लिए, बस पाली का उपयोग करें।
पीटर कॉर्डेस

जवाबों:


8

सामान्य मामले के लिए, @dat_ha का उत्तर सही है, लेकिन यह ध्यान देने योग्य है कि आप एक विशेष मामला चाहते हैं ... दो की शक्तियां। क्योंकि कंप्यूटर द्विआधारी अंकगणित का उपयोग करते हैं, दो की शक्तियों वाले संचालन में अक्सर कुछ शॉर्टकट उपलब्ध होते हैं।

दो की शक्ति से एक संख्या को गुणा करना, बाईं पारी के संचालन ( <<) द्वारा पूरा किया जा सकता है , जो शाब्दिक रूप से बाईं ओर संख्या (यानी, बिट्स) के द्विआधारी प्रतिनिधित्व के अंकों को स्थानांतरित करता है। बेस दो में, बाईं ओर एक स्थान को स्थानांतरित करना 2 से गुणा करने के समान है, जैसे आधार 10 में बाईं ओर एक स्थान को स्थानांतरित करना 10 से गुणा करना समान है। C ++ में बाईं पारी के ऑपरेटर के पूर्ण विवरण के लिए , स्टैक ओवरफ्लो पर यह जवाब देखें ।

यह ध्यान रखना महत्वपूर्ण है कि बाएं स्थानांतरण जानकारी खो सकता है; अंत से हटे बिट्स खो गए हैं। क्योंकि आपको 2 से 10 तक की शक्तियों की आवश्यकता होती है, आप हस्ताक्षर किए गए पूर्णांक के साथ काम करते समय सुरक्षित होते हैं, जिसमें Arduino Uno का अधिकतम मूल्य होता है2^15-1

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

int pow2(int p){
    return 1 << p;
}

त्रुटि: यदि आप a का उपयोग करते हैं तो यह 2 ^ 32 - 1 तक जा सकता है unsigned long
डाट हा

@ दाता धन्यवाद, मुझे लगता है कि संपादन के दौरान "हस्ताक्षरित" शब्द खो गया है। फिक्स्ड।
जेसन क्लार्क

1
यदि आप मनमाने ढंग से सटीक पूर्णांक अंकगणित के कार्यान्वयन का उपयोग करते हैं तो यह 2 ^ 32 - 1 से आगे बढ़ सकता है
Dat Han Bag

मैं विशेष रूप से यह जानना चाहता हूं कि pow () के परिणामों पर पूर्णांक रूपांतरण के परिणाम 2. की शक्तियों के लिए काम क्यों नहीं करते हैं। मेरे लिए, pow (2,3) 8.00 देता है, लेकिन int (8.00) रिटर्न 8 , int (pow (2,3)) 7 रिटर्न देता है!
केडीएम

1

यह साथ काम करता है int, double, longऔर floatunsigned longऔर unsigned intभी काम करना चाहिए। आपको केवल फ़्लोट्स का उपयोग करने की आवश्यकता नहीं है।

आशा है कि यह मदद की!


उत्तर कार्यों के ऊपर उत्तर का कारण यह है क्योंकि वास्तविक संख्याओं (जिसमें फ़्लोट होते हैं) के सेट में पूर्णांक का सेट होता है
Dat Han Bag

@ दत्तानबाग: और अधिक महत्वपूर्ण बात यह है कि प्रत्येक 32-बिट पूर्णांक एक द्वारा बिल्कुल प्रतिनिधित्व योग्य है double। दरअसल, जब से IEEE फ़्लोटिंग पॉइंट एक बाइनरी मंटिसा / घातांक प्रतिनिधित्व पर आधारित है, 2 की प्रत्येक शक्ति 2 ^ 53 से परे भी बिल्कुल प्रतिनिधित्व योग्य होनी चाहिए (वह बिंदु जहाँ doubleहर मनमानी पूर्णांक का प्रतिनिधित्व नहीं कर सकता है, अंतिम स्थान पर 1 यूनिट। mantissa 1.0 से अधिक है)।
पीटर कॉर्डेस

@PeterCordes हाँ मुझे यह पता था। हो सकता है कि मैंने फ्लोट और पूर्णांक सेट का उल्लेख करते समय "बाउंड सेट्स" कहा हो, जो कि मेरी टिप्पणी के उत्तर में arduino के लिए सेट करें
Dat Han Bag

4
pow()पूर्णांक के लिए उपयोग करने के सामान्य प्रश्न का यह कुछ हद तक मान्य उत्तर है , लेकिन AFAICT arduino में हार्डवेयर फ़्लोटिंग पॉइंट भी नहीं है, इसलिए यह एक भयानक उत्तर है। इस तरह एक पूर्णांक pow()कार्यान्वयन जो लॉग 2 (एन) समय में गुणा करता है और एक परिणाम को जमा करने के लिए जोड़ना लगभग निश्चित रूप से बेहतर प्रदर्शन करेगा, और यह उल्लेख करने में विफल है कि 2 की शक्तियों के लिए बिट शिफ्ट्स का काम सिर्फ इस प्रश्न का एक भयानक उत्तर देता है।
पीटर कॉर्डेस

1
@PeterCordes "तो यह एक भयानक जवाब है"। -इस बात से सहमत हैं कि यह एक निम्न गुणवत्ता वाला सरल उत्तर है। pow () log2 (n) में निश्चित रूप से कम्प्यूटेशनल है - स्कूल में सीखी जाने वाली सरल विधि (अपने आप में शक्ति से गुणा संख्या इतनी कुशल नहीं है)। आप इसे वास्तव में बड़े पूर्णांकों के लिए एक फूरियर रूपांतरण के साथ बेहतर कर सकते हैं। लेकिन शायद ओपी इसे स्वीकार करेंगे और पसंद करेंगे।
डाट हान बैग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.