2010-06-30 15 views
7

मैं एक सरल करने के लिए math.h someihing समान से pow() कार्य करने के लिए कॉल ..अस्पष्ट पॉव() फ़ंक्शन

#include<math.h> 
int main() 
{ 
    float v,w; 
    w=3.0; 
    v=pow(w,0.5);//i think this is 'float pow(float,float)' 
    return 0; 
} 

लेकिन दृश्य स्टूडियो कहते हैं कि यह एक त्रुटि

1>c:\users\user\documents\visual studio 2008\projects\deo\deo\main.cpp(7) : error C2666: 'pow' : 6 overloads have similar conversions 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(575): could be 'long double pow(long double,int)' 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(573): or  'long double pow(long double,long double)' 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(527): or  'float pow(float,int)' 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(525): or  'float pow(float,float)' 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(489): or  'double pow(double,int)' 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(123): or  'double pow(double,double)' 
1>  while trying to match the argument list '(float, double)' 

है बनाने के लिए कोशिश कर रहा हूँ मैंने सोचा कि मेरे पास प्रारूप float pow(float, float) था।

+4

कि त्रुटि संदेश की अंतिम पंक्ति पढ़ें। 0.5 को डबल माना जाता है, और संकलक यह नहीं समझ सकता कि इसे ऑटो-रीस्टास्ट करना क्या है क्योंकि कई ऐसे कलाकार हैं जो काम कर सकते हैं। – tloach

+0

मैं 'सी' टैग हटा रहा हूं क्योंकि यह' C++ 'के लिए अद्वितीय है। –

उत्तर

18

लाइन में:

v=pow(w,0.5); 

w एक नाव है और 0.5 एक double है। आप इसके बजाय 0.5f का उपयोग कर सकते हैं।

+0

हाँ .. आप 'पाउ (फ्लोट, डबल)' कॉल करने की कोशिश कर रहे थे। कंपाइलर यह नहीं जानता कि क्या आप इसे 'पाउ (फ्लोट, फ्लोट)' (परिशुद्धता का नुकसान) या 'पाउ (डबल, डबल)' में डालना चाहते हैं। दरअसल ... मुझे नहीं पता कि यह दूसरा क्यों नहीं चुनता है ... शायद क्योंकि समारोह पूरी तरह से कुछ अलग हो सकता है। – mpen

+0

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

2

प्रयास करें v=pow(w,0.5f);

2

0.5 प्रकार पर दो की है। कोशिश

v=pow(w,0.5f); 
1

अरे, आप 0.5f की कोशिश की?

4

पाउ(), पाप() आदि जैसे गणित कार्य अधिक आधुनिक सी ++ कार्यान्वयन में templatized हैं। यह संदिग्ध कारण यह है कि यह स्पष्ट नहीं है कि आप क्या करना चाहते हैं। यदि आप दोनों तर्कों को समान रूप से भेजते हैं, तो संभवतः आप उस विशिष्ट परिशुद्धता पर गणना करना चाहते हैं। यदि वे अलग हैं, तो क्या आप उच्च परिशुद्धता पर गणना करना चाहते हैं और निचले परिशुद्धता परिचालन को ऊपर उठाना चाहते हैं, या आप उच्च परिशुद्धता को कम परिशुद्धता के लिए कम करना चाहते हैं और फिर कम परिशुद्धता पर गणना करें। अर्थात

float a,b; 
double c,d; 
pow(a,b); // not ambiguous, done at float precision 
pow(c,d); // not ambiguous, done at double precision 
pow(a,c); // ambiguous, gives error 
pow((double)a,c); // not ambiguous, performs computation at double precision 
pow(a,(float)c); // not ambiguous, gives computation at float precision, but c might lose precision in the down cast 
0

अन्य सभी तरीकों कि पहले से ही अन्य उत्तर में दिए गए थे के अलावा, आप हमेशा स्पष्ट रूप से टेम्पलेट तर्क निर्दिष्ट कर सकते हैं:

float w = 3.0f; 
double v = 1.5; 
v = pow<float>(w, v); 
संबंधित मुद्दे