2012-12-08 44 views
10

तो मैं कंप्यूटिंग प्रतियोगिता में था और मैंने एक अजीब बग देखा। पाउ (26,2) हमेशा 675, और कभी-कभी 674 वापस आ जाएगा? भले ही सही उत्तर 676 है। इस प्रकार की त्रुटियां भी पाउ (26,3), पाउ (26,4) आदि के साथ होती हैं, प्रतियोगिता के बाद कुछ डिबगिंग के बाद मुझे लगता है कि उत्तर को वास्तविक अंतराल के साथ करना है। दिलचस्प बात यह है कि इस तरह की त्रुटि पहले कभी नहीं हुई है। मैं जो कंप्यूटर विंडोज 8 पर mingw चला रहा था। जीसीसी संस्करण काफी नया था, 2-3 महीने की उम्र में मुझे विश्वास है। लेकिन मुझे जो मिला वह यह था कि अगर मैंने इस प्रकार की त्रुटि पर ओ 1/ओ 2/ओ 3 ऑप्टिमाइज़ेशन ध्वज बदल दिया तो चमत्कारिक रूप से गायब हो जाएगा। पाउ (26,2) हमेशा 676 उर्फ ​​सही उत्तर मिलेगा क्या कोई बता सकता है क्यों?जीसीसी सी ++ पावर सटीकता

#include <cmath> 
#include <iostream> 

using namespace std; 
int main() { 
    cout<<pow(26,2)<<endl; 
    cout<<int(pow(26,2))<<endl; 
} 

युगल के साथ परिणाम अजीब हैं।

double a=26; 
double b=2; 
cout<<int(pow(a,b))<<endl; #outputs 675 
cout<<int(pow(26.0,2.0))<<endl; # outputs 676 
cout<<int(pow(26*1.00,2*1.00))<<endl; # outputs 676 
+2

'पाउ (26,2)' 26 * 26 = 676 में? –

+0

हाँ, पावर मानक पावर फ़ंक्शन के रूप में। –

+0

क्या आप अपना कोड पोस्ट कर सकते हैं? मुझे यकीन नहीं है कि आप इन मानों को कैसे प्राप्त करेंगे। –

उत्तर

10

समारोह pow दो फ्लोटिंग प्वाइंट मूल्यों पर चल रही है, और अन्य के लिए एक बढ़ा सकते हैं। यह एल्गोरिदम को अनुमानित करके किया जाता है, क्योंकि इसे सबसे छोटे से सबसे बड़े मूल्यों को संभालने में सक्षम होना आवश्यक है।

चूंकि यह अनुमानित एल्गोरिदम है, इसलिए कभी-कभी यह मान थोड़ा सा गलत हो जाता है। ज्यादातर मामलों में, यह ठीक है। हालांकि, यदि आप सटीक परिणाम प्राप्त करने में रुचि रखते हैं, तो इसका उपयोग न करें।

मैं पूर्णांक के लिए इसका उपयोग करने के खिलाफ दृढ़ता से सलाह दूंगा। और यदि दूसरा ऑपरेंड ज्ञात है (2, इस मामले में) कोड के साथ इसे बदलने के लिए यह छोटा है जो यह बहुत तेज़ करता है और यह सही मान देता है। उदाहरण के लिए: कुछ compilers अन्य कोड के साथ pow के लिए कॉल जगह ले सकता है, या सभी को साथ खत्म करने जब एक या दोनों बहस में जाना जाता है:

int square(int x) 
{ 
    return x * x; 
} 

वास्तविक प्रश्न का उत्तर देने। यह बताता है कि आपको अलग-अलग परिणाम क्यों मिलते हैं।

+1

कोई विशेष कारण जो आप मैक्रो का उपयोग करने की सिफारिश कर रहे हैं और फ़ंक्शन नहीं? – NPE

+1

इसके अलावा, मैं प्रतिस्थापित करूँगा * ज्ञात * के साथ * ज्ञात छोटा पूर्णांक * है। यदि यह ज्ञात है तो यह बहुत अधिक उपयोग नहीं है या तो बड़े या आंशिक है। – NPE

+0

@ एनपीई, मैंने एक मैक्रो उठाया क्योंकि यह टाइप-तटस्थ है, और यह टाइप करना आसान था :)। बेशक, यदि आप इस प्रकार को जानते हैं तो आप एक फ़ंक्शन को परिभाषित कर सकते हैं, वैकल्पिक रूप से अधिभारित फ़ंक्शंस का सेट, या यहां तक ​​कि एक टेम्पलेट फ़ंक्शन भी। – Lindydancer