2010-11-13 63 views
33

Tại sao các bit sau công việc mã trong C:Sử dụng pow() chức năng ném lỗi tham chiếu không xác định trong C

int res = pow(2, 3); 
printf("%d\n", res); 

trong khi điều này khác không?

int a = 2; 
int b = 3; 

int res = pow(a, b); 
printf("%d\n", res); 

Thậm chí nếu tôi cố gắng

double a = 2; 
double b = 3; 

double res = pow(a, b); 
printf("%f\n", res); 

tôi nhận được một

tài liệu tham khảo không xác định cho `pow'

Tôi đang làm gì sai?

+0

Đoạn mã hoàn chỉnh sẽ hữu ích ... –

+0

Bạn có bao gồm math.h hay không? –

+0

Tôi bao gồm math.h, vâng. Đoạn mã đầu tiên hoạt động và xuất ra những gì được mong đợi. Hai cái còn lại cung cấp cho "tham chiếu không xác định đối với" pow "". –

Trả lời

52

Khi nó hoạt động, đó là vì việc tính toán đã được thực hiện bởi trình biên dịch riêng của mình (và bao gồm trong hệ nhị phân, nếu như bạn đã viết nó ra)

printf("8\n"); 

Khi nó không hoạt động, là bởi vì pow chức năng được bao gồm trong thư viện toán và thư viện toán học không được liên kết với nhị phân của bạn theo mặc định.
Để có được thư viện toán học để được liên kết, nếu trình biên dịch của bạn là gcc, sử dụng

gcc ... -lm ... 

Với trình biên dịch khác, nên được như vậy :)
nhưng đọc tài liệu

+4

Bạn đang phát hiện! GCC sử dụng MPFR. Dưới đây là một số thông tin: http://gcc.gnu.org/gcc-4.3/changes.html#mpfropts – swatkat

+0

MPFR! Woh! :) Hoàn toàn đánh tôi khi tôi đang cố gắng chính xác điều tương tự và không thể tin những gì tôi đã thấy. – Deqing

16

undefined reference to 'pow' âm thanh như một mối liên kết lỗi. Bạn không liên kết trong thư viện toán, ngay cả khi bạn giới thiệu hàm pow bằng cách bao gồm <math.h>.

Với gcc, hãy sử dụng tham số dòng lệnh -lm để liên kết trong lib toán.

+0

-1: câu trả lời giống hệt nhau – karthik

+11

Nếu bạn nhận thấy, các câu trả lời giống hệt nhau đã được đăng <= 1 phút ngoài. Điều đó có thể giúp giải thích tại sao. –

2

Sử dụng như

#include <math.h> 
#include <stdio.h> 

int main(void) 
{ 
    for(int i = 1; i < 5; i++) 
    printf("pow(3.2, %d) = %lf\n", i, pow(3.2, i)); 
    return 0; 
} 

Output này:

pow (3,2, 1) = 3,200000

+0

+1 cho ví dụ làm việc (mặc dù nó không thực sự trả lời câu hỏi): Tại sao downvote? (không phải là tôi) --- Tôi đoán vì ''% lf '' là một trình chuyển đổi không hợp lệ, nhưng downvoter có thể hữu ích hơn một chút – pmg

-5

không xác định tài liệu tham khảo cho `pow'

vì quyền lực cho bất kỳ số nào phải có giá trị số nguyên là điện

pow(x,y) 
where, x must be real and y must be a whole number 
+0

Tôi biết đây là cũ, nhưng chỉ cần đề cập, điều này không đúng , pow() nhận hai đối số kép. ;) – Pascal

Các vấn đề liên quan