2010-06-30 41 views
7

Tôi cố gắng để thực hiện cuộc gọi đơn giản để các pow() chức năng từ math.h someihing tương tự như ..pow mơ hồ() chức năng

#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; 
} 

nhưng visual studio nói nó là một lỗi

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)' 

Tôi nghĩ tôi có định dạng float pow(float, float).

+4

đọc dòng cuối cùng của thông báo lỗi. 0,5 được coi là một đôi, và trình biên dịch không thể tìm ra những gì để tự động recast nó để kể từ khi có một số phôi mà nó có thể làm điều đó sẽ làm việc. – tloach

+0

Tôi đang xóa thẻ 'c' vì điều này là duy nhất cho' C++'. –

Trả lời

18

Trong dòng:

v=pow(w,0.5); 

w là một phao và 0.5 là một double. Thay vào đó, bạn có thể sử dụng 0.5f.

+0

Yeah..bạn đang cố gọi 'pow (float, double) '. Trình biên dịch không biết nếu bạn muốn truyền nó tới 'pow (float, float)' (mất độ chính xác) hoặc 'pow (double, double)'. Thực ra ... Tôi không biết tại sao nó không chọn cái thứ hai ... có lẽ bởi vì chức năng này có thể khác hoàn toàn. – mpen

+0

Nó không chọn thứ hai bởi vì nó không biết rằng ngữ nghĩa là đủ tốt trong thực tế cho hầu hết các sử dụng, và nó không phải là giá trị giảng dạy nó bởi vì chắc chắn không thể quản lý các trường hợp góc. Ví dụ, nếu kết quả của cái đầu tiên nằm ngoài phạm vi, mã hạ lưu có thể phụ thuộc vào hành vi đó. Con người nên ra quyết định; trình biên dịch nên thực hiện chúng. – mabraham

2

Hãy thử v=pow(w,0.5f);

2

0.5 là kiểu double. Hãy thử

v=pow(w,0.5f); 
1

Xin chào, bạn đã thử 0.5f chưa?

4

Các hàm toán học như pow(), sin() vv được tạo khuôn mẫu trong các triển khai C++ hiện đại hơn. Lý do nó mơ hồ là không rõ bạn muốn làm gì. Nếu bạn gửi trong cả hai đối số là như nhau, bạn có lẽ muốn tính toán được thực hiện ở độ chính xác cụ thể đó. Nếu chúng khác nhau, thì bạn có muốn tính toán ở độ chính xác cao hơn và upcast toán hạng chính xác thấp hơn hay bạn muốn downcast độ chính xác cao hơn để giảm độ chính xác và sau đó thực hiện tính toán ở độ chính xác thấp hơn. ví dụ:

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

Ngoài tất cả các phương pháp khác mà đã được đưa ra trong các câu trả lời khác, bạn luôn có thể xác định rõ ràng mẫu đối số:

float w = 3.0f; 
double v = 1.5; 
v = pow<float>(w, v);