2011-10-29 14 views
6

को असाइन किए जाने पर गोलाकार हो जाता है, मैं सी में pow फ़ंक्शन का उपयोग कर रहा हूं और एक पूर्णांक प्रकार में वापसी मान संग्रहीत कर रहा हूं।पावर() के वापसी मूल्य को पूर्णांक

for (i = 0; i < 5; i++){ 
    val = (int)pow(5, i); 
    printf("%d, ", val); 
} 

यहाँ i, और val पूर्णांक हैं और आउटपुट 1, 5, 24, 124, 624 है: नीचे कोड स्निपेट देखें। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि एक फ्लोट 25 को 24.9 99 99 के रूप में माना जाता है ... जो एक पूर्णांक के लिए असाइनमेंट पर 24 तक गोल हो जाता है।

अगर मुझे अभी भी एक int में वापसी मूल्य को स्टोर करने की आवश्यकता है तो मैं इसे कैसे पार कर सकता हूं?

+0

'float' 25' 24.9 ... ', 25 वास्तव में एक नाव के रूप में प्रतिनिधित्व किया जा सकता है नहीं" के रूप में इलाज "है। यह सिर्फ इतना है कि 'पाउ' पूरी तरह सटीक नहीं है, और इस अवसर पर किसी कारण से कम छूट गई है। कई मूल्यों के लिए यह संभवतः पूरी तरह सटीक नहीं हो सकता है, क्योंकि गणितीय रूप से सही उत्तर सटीक फ्लोट नहीं है, लेकिन इन गणनाओं के लिए यह हो सकता है, और इसलिए यह एक गुणवत्ता-कार्यान्वयन मुद्दा है चाहे वह है या नहीं। –

+1

यह भी देखें कि http://stackoverflow.com/questions/101439/the-most- कुशल-way-to-implement-an-integer-based-power-function-powint-int के पूर्णांक संस्करण को कार्यान्वित करने के तरीके के बारे में चर्चा के लिए पाउ() –

+0

पूर्णांक एक्सपोनिएशन के लिए 'पाउ' का उपयोग न करें। बहुत बेहतर, सुरक्षित तरीके हैं। वैसे, आप इस व्यवहार को किस मंच पर प्राप्त कर रहे हैं? मैंने सोचा कि एक अच्छा 'पाउ' हमेशा पूर्णांक के लिए सटीक होगा जहां सटीक परिणाम 'डबल' में फिट बैठता है। –

उत्तर

9

int पर कास्टिंग करने से पहले 0.5 जोड़ें। यदि आपका सिस्टम इसका समर्थन करता है, तो आप C99 round() फ़ंक्शन को कॉल कर सकते हैं, लेकिन मैं पोर्टेबिलिटी कारणों से बचाना पसंद करता हूं।

+3

थोड़ा सा अंतर है, कि 'गोल' शून्य से दूर है, जबकि 0.5 जोड़कर 'int' राउंड तक कास्टिंग। तो उदाहरण के लिए 'राउंड (पाउ (-0.5,1)) '-1 है, जबकि' (int) (पाउ (-0.5,1) + 0.5) '0 है। इसलिए प्रश्नकर्ता को यह तय करने की आवश्यकता हो सकती है कि वे क्या चाहते हैं, हालांकि बेशक अगर उत्तर एक पूर्णांक के करीब है तो इससे कोई फर्क नहीं पड़ता है। –

+0

"शून्य से गोल दौर, जबकि 0.5 जोड़ना और int राउंड अप करने के लिए कास्टिंग" - आधे पूर्णांक मानों के लिए, मेरा मतलब है। –

+0

@ जोएलस्पोलस्की: संपादन के लिए धन्यवाद, लेकिन 'राउंड() 'सभी सिस्टम पर समर्थित नहीं है। मैंने तदनुसार आपके संपादन को योग्यता प्राप्त की है। –

3

अपने आप को लागू करें।

int myPow(int base, int exponent) { 
    int n = 1; 
    for (int i = 0; i < exponent; i++) { 
     n *= base; 
    } 
    return n; 
} 

यह जाहिर है, केवल सकारात्मक एक्स्पोनेंट्स संभालती है, और केवल ints पर काम करता है, और निश्चित रूप से और अधिक कुशल तरीके यह करने के लिए कर रहे हैं। देखें, उदाहरण के लिए, the source for ^ in Haskell

5

val = (int)pow(5, i); 

की जगह मैं इस समस्या को मेरी आत्म था

double d = pow(5,i); 
val = (int)((d > 0.0) ? floor(d + 0.5) : ceil(d - 0.5)); 
-3

साथ। मैंने इसे आसानी से आपके निर्देश में हल किया है बस अगर कथन जोड़ें।

if (k%n>0) 
{ 
    k=k+1; 
} 
संबंधित मुद्दे