2010-12-13 19 views
9

के साथ काम करने का कहते हैं कि मैं निम्नलिखित कोड का टुकड़ा करते हैं मना कर दिया।सी पॉव समारोह चर प्रतिपादक

math.h को शामिल या छोड़कर कोई फर्क नहीं पड़ता, क्योंकि यह किसी भी तरह से शामिल होने के समाप्त होता है।

हार्डकोडेड पावर के लिए 2.0 बढ़ाना ठीक है, लेकिन अगर मैं i वाली अभिव्यक्ति द्वारा एक्सपोनेंट को प्रतिस्थापित करता हूं तो सब कुछ विफल हो जाता है।

मैं क्या गलत कर रहा हूं? धन्यवाद।

+0

आप किस कंपाइलर का उपयोग कर रहे हैं? क्या 'पाउ() 'की कोई अन्य संभावित घोषणा है? क्या आप वास्तव में त्रुटि उद्धृत कर सकते हैं? –

+0

मैं जीसीसी का उपयोग कर रहा हूं और 'पाउ' की कोई अन्य घोषणा नहीं है। सवाल निश्चित रूप से उत्तर दिया गया है; लगभग सभी उत्तरों ने मुझे मदद की। काश मैं एक से अधिक स्वीकार कर सकता हूं। :) सबको धन्यवाद। –

+5

जबकि अन्य ने टिप्पणी की है कि क्यों 'पाउ' काम नहीं कर रहा था, इसलिए आप जो तथ्य 'पाउ' का उपयोग कर रहे हैं, वह आपके कोड के साथ एक बड़ी समस्या है। ** सी एक्सपोनेंट बेस 2 ** के लिए एक ऑपरेटर है और इसे '<< 'कहा जाता है। 'पाउ' के इस बेकार उपयोग को हटाएं और इसे '1 << i' से बदलें, और' डबल 'के बारे में भूल जाएं। –

उत्तर

16

यह एक बहुत ही दिलचस्प व्यवहार है और एक अच्छा सीखने उदाहरण पर -lm निर्दिष्ट करें।

अपनी समस्या को हल करने के लिए, अपने जीसीसी कमांड लाइन के लिए

-lm 

जोड़ने (आप जीसीसी का उपयोग कर रहे हो)। यह गणित पुस्तकालय के खिलाफ लिंक करने के लिए संकलक बताता है।

क्या हो रहा प्रतीत हो रहा है, अगर आप

pow(2.0, 3); 

का उपयोग कर रहे संकलक पता चलता है कि इस अभिव्यक्ति के लिए एक निरंतर मूल्यांकन करती है और मात्र प्रतिस्थापन करता है।

इस प्रकार, कोई लाइब्रेरी फ़ंक्शन नहीं कहा जाना चाहिए।

+0

यह वह स्पष्टीकरण है जिसे मैं पोस्ट करने वाला था। कंपाइलर 'पाउ (एन, 2) 'से' एन * एन', या इसी तरह के अनुकूलन करने में भी सक्षम हो सकता है। – zwol

+1

वास्तव में, एक अनुवर्ती टिप्पणी के रूप में .. अकेले उस लूप को संकलित करना, अधिकतम अनुकूलन (-ओ 3) वास्तव में -एलएम के बिना काम करता है। ऐसा इसलिए है क्योंकि मान का आगे उपयोग नहीं किया जाता है, और संकलक बस बेकार लूप और बेकार पाउ ​​() को अनलॉक और अनुकूलित करता है, इस प्रकार libm लाइब्रेरी से पाउ() फ़ंक्शन को कॉल करने की आवश्यकता नहीं होती है। – qdot

3

आपको गणित पुस्तकालय को वास्तव में शामिल करने के लिए -lm से लिंक करने की आवश्यकता है।

यह हार्डकोडेड मान के लिए काम करता था क्योंकि संकलक ने पॉव कॉल को अनुकूलित किया था।

0

http://www.cplusplus.com/reference/clibrary/cmath/pow/

सी में, केवल संस्करण दो डबल मापदंडों लेने के इस नाम के साथ मौजूद है। अन्य अधिभार केवल सी ++ में उपलब्ध हैं।

ऐसा लगता है कि आप एक int पास नहीं कर सकते हैं, तो बस i को दोहराएं और इसे काम करना चाहिए।

+0

" सामान्य अंकगणितीय रूपांतरण "यदि आवश्यक हो तो एक int को एक डबल में परिवर्तित करें। आप गलत पेड़ को भड़क रहे हैं। – zwol

+0

और वह एक निशान के लायक है? चीज़। – acron

+0

यह एक गलत जवाब है, और यह गलत सवाल का जवाब देता है। तो हाँ। – zwol

1

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

कि ऐसा करने के लिए, जीसीसी के साथ, संकलक मंगलाचरण

gcc ... -lm 
+3

माइनर चेतावनी: '-l' स्विच हमेशा कमांड लाइन पर सभी ऑब्जेक्ट फ़ाइलों के बाद * रखा जाना चाहिए। यदि आप नहीं करते हैं तो कुछ लिनक्स वितरण पर काम करना होता है, लेकिन इस पर भरोसा नहीं किया जाना चाहिए। – zwol

3

आप गणित पुस्तकालय के खिलाफ लिंक करना होगा:

gcc program.c -lm 

कारण है जीसीसी (और कुछ अन्य compilers) निर्मित एक शाब्दिक स्थिरांक के लिए pow() समारोह है। इसलिए यदि आप मैन्युअल रूप से 2.0 के साथ pow() पर कॉल करते हैं, तो संकलक वास्तव में यह समझ लेगा कि उत्तर क्या है और आपके लिए यह विकल्प है। परिवर्तनीय इनपुट के साथ, कंपाइलर को गणित पुस्तकालय पर भरोसा करना चाहिए, जिसे आपको इसके साथ लिंक करना होगा।

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