2011-12-13 31 views
12

Trong căn bậc ba thế giới thực cho một số âm nên tồn tại: cuberoot(-1)=-1, có nghĩa là (-1)*(-1)*(-1)=-1 hoặc cuberoot(-27)=-3, có nghĩa là (-3)*(-3)*(-3)=-27C - tìm căn bậc ba của một số âm với chức năng pow

Nhưng khi tôi tính toán khối gốc của một số âm trong C sử dụng pow chức năng, tôi nhận được nan (không phải là số)

double cuber; 
cuber=pow((-27.),(1./3.)); 
printf("cuber=%f\n",cuber); 

đầu ra: cuber=nan

Có cách nào để tính toán căn bậc ba của một số âm trong C?

Trả lời

19

7.12.7.1 Các cbrt chức năng

Tóm tắt

#include <math.h> 
double cbrt(double x); 
float cbrtf(float x); 
long double cbrtl(long double x); 

Mô tả

Các cbrt chức năng tính toán căn bậc ba thực sự của x.


Nếu bạn tò mò, không thể sử dụng pow để tính toán các gốc khối vì một phần ba không thể hiển thị dưới dạng số dấu phẩy động. Bạn đang thực sự yêu cầu pow để tăng -27.0 lên một quyền lực hợp lý rất gần bằng 1/3; không có kết quả thực sự nào phù hợp.

+0

'pow' có thể được sử dụng để tính căn bậc của các số dương. –

+3

@SteveJessop: 'pow' có thể được sử dụng để tính toán công suất' 0.333333333333333314829616256247390992939472198486328125' của một số dương, thường là (nhưng không phải lúc nào) giống như gốc khối sau khi làm tròn. –

+0

Nó gần như là tiêu chuẩn C đảm bảo 'cbrt' được (mà là không có bảo đảm ở tất cả). Mặc dù vậy, IEEE 754 có thể có điều gì khác để nói, nếu nó đảm bảo tính chính xác của 'cbrt'. –

6

có. Ghi nhớ: x^(1/3) = - (- x)^(1/3). Vì vậy, sau đây nên làm điều đó:

double cubeRoot(double d) { 
    if (d < 0.0) { 
    return -cubeRoot(-d); 
    } 
    else { 
    return pow(d,1.0/3.0); 
    } 
} 

Được viết mà không biên dịch, do đó có thể có lỗi cú pháp.

Greetings, Jost

0

Như Stephen Canon đã trả lời, để sửa chữa chức năng để sử dụng trong trường hợp này là cbrt(). Nếu bạn không biết số mũ trước, bạn có thể nhìn vào hàm cpow().

 

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

int main(void) 
{ 
    printf("cube root cbrt: %g\n", cbrt(-27.)); 
    printf("cube root pow: %g\n", pow(-27., 1./3.)); 
    double complex a, b, c; 
    a = -27.; 
    b = 1./3; 
    c = cpow(a, b); 
    printf("cube root cpow: (%g, %g), abs: %g\n", creal(c), cimag(c), cabs(c)); 
    return 0; 
} 
 

in

 
cube root cbrt: -3 
cube root pow: -nan 
cube root cpow: (1.5, 2.59808), abs: 3 

Hãy ghi nhớ những định nghĩa về sức mạnh phức tạp: cpow (a, b) = cexp (b * làm tắc nghẽn (a)).

0

Sử dụng phương pháp của Newton:

def cubicroot(num): 
    flag = 1 
    if num < 0: 
    flag = -1 
    num = num - num - num 
    x0 = num/2. 
    x1 = x0 - (((x0 * x0 * x0) - num)/(3. * x0 * x0)) 
    while(round(x0) != round(x1)): 
    x0 = x1 
    x1 = x0 - (((x0 * x0 * x0) - num)/(3. * x0 * x0)) 
    return x1 * flag 

print cubicroot(27) 
+0

anh ấy đang sử dụng python – dns

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